On 1/14/12, Chris Kavanagh <cka...@msn.com> wrote: > I was looking at this code from the Python Docs > (http://docs.python.org/library/email-examples.html), trying to learn > how to send email from a Pyhton script. Anyways, part of this code > confused me. Here's the script: > > 1 # Import smtplib for the actual sending function > 2 import smtplib > 3 > 4 # Import the email modules we'll need > 5 from email.mime.text import MIMEText > 6 > 7 # Open a plain text file for reading. For this example, assume that > 8 # the text file contains only ASCII characters. > 9 fp = open(textfile, 'rb') > 10 # Create a text/plain message > 11 msg = MIMEText(fp.read()) > 12 fp.close() > 13 > 14 # me == the sender's email address > 15 # you == the recipient's email address > 16 msg['Subject'] = 'The contents of %s' % textfile > 17 msg['From'] = me > 18 msg['To'] = you > 19 > 20 # Send the message via our own SMTP server, but don't include the > 21 # envelope header. > 22 s = smtplib.SMTP('localhost') > 23 s.sendmail(me, [you], msg.as_string()) > 24 s.quit() > > What I don't understand is lines 16-18, more specifically the > msg['Subject'] format. I thought this was only done with dics?? > Obviously the variable msg isn't a dic, so how can this be done?? > > I actually put lines 11, 16,17,18, in the interpreter, then printed out > msg, so I get what it's doing, but my question still stands. How can one > do this, when I thought it could only be done with dictionaries???
Chris, I haven't looked at the module, but you should be aware that you can have user-defined classes which behave like builtin types, with their own customised features. You can also subclass a dict and customise it to do whatever. That said, as long as an object provides dictionary access methods, it can be treated like a dict in every respect. As far as python is concerned, if it looks like a duck and quacks like a duck - it's a duck. (Or in this case a dict.) It doesn't matter what the 'type' is, what is important is how you can access it. Here's an example:: # example.py # The following exapmle could be done more cleanly by subclassing the builtin # dict type, but for illustrative purposes this was not done. Instead, we show # several dict methods being defined on our dict-like class 'Foo': class Foo(object): '''This object behaves like a builtin dict that refuses the value "red".''' def __init__(self, x, y): self.x = x #<-- We can have our own properties too. self.y = y self.data = {} def __getitem__(self, key): '''Return 'key' when accessed like self[key]''' return self.data[key] def __setitem__(self, key, value): '''Sets self[key] = value''' if value == "red": raise ValueError("Red is not acceptable!") else: self.data[key] = value def items(self): '''These could do whatever you want.''' return self.data.items() def keys(self): '''These could do whatever you want.''' return self.data.keys() def values(self): '''These could do whatever you want.''' return self.data.values() #=================================================== # Now let's use it! #=================================================== a = Foo(x=3, y=5) # Is 'a' a dict? # False print type(a) # Is it an instance of a dict? # False print isinstance(a, dict) # Can we *use* a like a dict? a['sky'] = "orange" a['ocean'] = "blue" for k,v in a.items(): print k,v for v in a.values(): print v ## Yes! Yet, it has it's own set of unique features: print a.x #<-- Prints 3 print a.y #<-- Prints 5 a['blood'] = "red" #<-- Raises exception. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor