如何在 Python 格式字符串中使用点?
How to use a dot in Python format strings?
我想格式化一个字符串并能够使用点运算符,这样我就可以构造包含例如{user.name}
, {product.price}
.
我试过这个:
'Hello {user.name}'.format( {'user': { 'name': 'Markus' } } )
KeyError: 'user'
'Hello {user.name}'.format( **{'user': { 'name': 'Markus' } } )
AttributeError: 'dict' object has no attribute 'name'
有办法吗?
不幸的是,Python dict
objects 默认情况下不可访问属性(即使用点符号)。所以你可以选择更丑陋的括号表示法:
'Hello {user[name]}'.format( **{'user': { 'name': 'Markus' } } )
或者您可以将数据包装在 dot-accessible object 中。您可以从 PyPI, such as stuf 安装一些 attribute-accessible 词典 类。
from stuf import stuf
'Hello {user.name}'.format( **stuf({'user': { 'name': 'Markus' } }) )
我倾向于将我的 collections 保留在 stuf
object 中,以便我可以通过属性轻松访问它们。
最小的变化是在模板中使用方括号,而不是句点:
# v Note
>>> 'Hello {user[name]}'.format(**{'user': {'name': 'Markus'}})
'Hello Markus'
或者,将 实际上具有该属性 的对象放入字典中,例如自定义 class 或 collections.namedtuple
:
>>> class User(object):
def __init__(self, name):
self.name = name
>>> 'Hello {user.name}'.format(**{'user': User('Markus')})
'Hello Markus'
另请注意,如果您要写出文字,则可以只使用关键字参数:
>>> 'Hello {user.name}'.format(user=User('Markus'))
'Hello Markus'
使用理解法将字典展平....
def flatten_dict(dd, separator='>', prefix=''):
return {
prefix + separator + k if prefix else k : v
for kk, vv in dd.items()
for k, v in flatten_dict(vv, separator, kk).items()
} if isinstance(dd, dict) else { prefix : dd }
这样的调用:
x = { 'A':1, 'B':{'C':2}}
y = flatten_dict(x)
生产:
y = { 'A':1, 'B>C':2}}
我想格式化一个字符串并能够使用点运算符,这样我就可以构造包含例如{user.name}
, {product.price}
.
我试过这个:
'Hello {user.name}'.format( {'user': { 'name': 'Markus' } } )
KeyError: 'user'
'Hello {user.name}'.format( **{'user': { 'name': 'Markus' } } )
AttributeError: 'dict' object has no attribute 'name'
有办法吗?
Python dict
objects 默认情况下不可访问属性(即使用点符号)。所以你可以选择更丑陋的括号表示法:
'Hello {user[name]}'.format( **{'user': { 'name': 'Markus' } } )
或者您可以将数据包装在 dot-accessible object 中。您可以从 PyPI, such as stuf 安装一些 attribute-accessible 词典 类。
from stuf import stuf
'Hello {user.name}'.format( **stuf({'user': { 'name': 'Markus' } }) )
我倾向于将我的 collections 保留在 stuf
object 中,以便我可以通过属性轻松访问它们。
最小的变化是在模板中使用方括号,而不是句点:
# v Note
>>> 'Hello {user[name]}'.format(**{'user': {'name': 'Markus'}})
'Hello Markus'
或者,将 实际上具有该属性 的对象放入字典中,例如自定义 class 或 collections.namedtuple
:
>>> class User(object):
def __init__(self, name):
self.name = name
>>> 'Hello {user.name}'.format(**{'user': User('Markus')})
'Hello Markus'
另请注意,如果您要写出文字,则可以只使用关键字参数:
>>> 'Hello {user.name}'.format(user=User('Markus'))
'Hello Markus'
使用理解法将字典展平....
def flatten_dict(dd, separator='>', prefix=''):
return {
prefix + separator + k if prefix else k : v
for kk, vv in dd.items()
for k, v in flatten_dict(vv, separator, kk).items()
} if isinstance(dd, dict) else { prefix : dd }
这样的调用:
x = { 'A':1, 'B':{'C':2}}
y = flatten_dict(x)
生产:
y = { 'A':1, 'B>C':2}}