Django – How Does It Turn Field Name Strings to Variables?

duck-typingpython

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?

Best Answer

Python has numerous ways to turn strings into objects. The most important are:

  • Attribute access with getattr(), allowing you to translate foo.bar into getattr(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, so instance.__dict__[key] works in many cases. Module namespaces use a mapping like that too.

    The built-in functions vars(), locals() and globals() 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.