[Tutor] Simple Question (I Hope)

Modulok modulok at gmail.com
Sun Jan 15 05:17:15 CET 2012


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.


More information about the Tutor mailing list