[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