Search code examples
pythonstring-formatting

How to use a dot in Python format strings?


I want to format a string and be able to use the dot operator, so that I can construct template strings containing e.g. {user.name}, {product.price}.

I tried this:

'Hello {user.name}'.format( {'user': { 'name': 'Markus' } } )
KeyError: 'user'

'Hello {user.name}'.format( **{'user': { 'name': 'Markus' } } )
AttributeError: 'dict' object has no attribute 'name'

Is there a way to do it?


Solution

  • Python dict objects are unfortunately not attribute accessible (i.e. with the dot notation) by default. So you can either resign yourself to the uglier brackets notation:

    'Hello {user[name]}'.format( **{'user': { 'name': 'Markus' } } )
    

    Or you can wrap your data in a dot-accessible object. There are a handful of attribute-accessible dictionary classes you can install from PyPI, such as stuf.

    from stuf import stuf
    
    'Hello {user.name}'.format( **stuf({'user': { 'name': 'Markus' } }) )
    

    I tend to keep my collections in stuf objects so that I can easily access them by attribute.