Ich wusste nicht, dass man so etwas tun kann:
def tom():
print "tom's locals: ", locals()
def dick(z):
print "z.__name__ = ", z.__name__
z.guest = "Harry"
print "z.guest = ", z.guest
print "dick's locals: ", locals()
tom() #>>> tom's locals: {}
#print tom.guest #AttributeError: 'function' object has no attribute 'guest'
print "tom's dir:", dir(tom) # no 'guest' entry
dick( tom) #>>> z.__name__ = tom
#>>> z.guest = Harry
#>>> dick's locals: {'z': <function tom at 0x02819F30>}
tom() #>>> tom's locals: {}
#print dick.guest #AttributeError: 'function' object has no attribute 'guest'
print tom.guest #>>> Harry
print "tom's dir:", dir(tom) # 'guest' entry appears
Die Funktion tom() hat keine Locals. Die Funktion dick() weiß, wo tom() wohnt, und legt Harry als 'Gast' bei tom() an. harry erscheint nicht als Local bei tom(), aber wenn Sie nach Toms Gast fragen, antwortet harry. harry ist ein neues Attribut bei tom().
UPDATE: Von außerhalb von tom() können Sie "print dir(tom)" sagen und das Wörterbuch des tom-Objekts sehen. (Man kann das auch von innerhalb tom(), too. So konnte Tom herausfinden, dass er einen neuen Untermieter hatte, Harry, der unter dem Namen "Gast" auftrat).
Attribute können also von außerhalb der Funktion zum Namensraum einer Funktion hinzugefügt werden? Wird das oft gemacht? Ist das eine akzeptable Praxis? Ist es in manchen Situationen empfehlenswert? Ist es manchmal sogar unerlässlich? (Ist es pythonisch?)
UPDATE: Im Titel steht jetzt "Attribute"; früher hieß es "Variablen". Hier ist ein PEP über Funktionsattribute .