[Tutor] Simple Question (I Hope)

Chris Kavanagh ckava1 at msn.com
Mon Jan 16 02:47:13 CET 2012



On 1/14/2012 11:17 PM, Modulok wrote:
> On 1/14/12, Chris Kavanagh<ckava1 at 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.
>
>
Thanks for the help. . .I think I see what you're saying. And to make it 
short & simple, the MIMEText Class behaves the way it does, because 
that's just how it works (or was designed). So just accept it, & move 
on, lol.

Thanks again for the reply and the example,it's most appreciated.



More information about the Tutor mailing list