I’m very new to python and (coming from Java) am trying to think in a “pythonic” way. I’m having trouble understanding how Django turns a function (or variable) name given in string to the actual function.
Example from Django tutorial: If we give:
list_display = ('question', 'pub_date', 'was_published_recently')
Django reads the function and some related properties from the code:
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
So, my question: How does the string get turned into the actual function name?
2
Python has numerous ways to turn strings into objects. The most important are:
-
Attribute access with
getattr()
, allowing you to translatefoo.bar
intogetattr(foo, 'bar')
. -
Dictionary access,
mapping[key]
. Almost anything in Python can be reduced to dictionaries; by default class instances store information in a mapping called__dict__
for example, soinstance.__dict__[key]
works in many cases. Module namespaces use a mapping like that too.The built-in functions
vars()
,locals()
andglobals()
all return a namespace mapping.
If you are interested in Python introspection, you may want to study the Python datamodel, and take a look at the inspect
library as well.
1