使用dict vs class __dict__方法格式化字符串

时间:2011-05-07 15:10:28

标签: python

我一直在使用dict格式化字符串

s = '%(name1)s %(name2)s'
d = {}
d['name1'] = 'asdf'
d['name2'] = 'whatever'
result = s % d

我刚刚意识到我可以在课堂上使用 dict 方法 代替:

s = '%(name1)s %(name2)s'
class D : pass
d = D()
d.name1 = 'asdf'
d.name2 = 'whatever'
result = s % d.__dict__

(显然我是为了更大的字符串和许多键而这样做。)

我忽略了班级方法有什么不利吗? 或者是否有更好的方法来执行我缺少的字符串格式化?

谢谢。

2 个答案:

答案 0 :(得分:8)

您可以使用新式格式,允许格式字符串中的getattr和getitem运算符:

>>> class X(object):
...     pass
... 
>>> x = X()
>>> x.x = 1
>>> d = {'a':1, 'b':2}
>>> "{0[a]} {0[b]} {1.x}".format(d, x)
'1 2 1'

关于您的方法的缺点 - 对象的__dict__仅限于特定实例具有的任何属性和方法,因此在类级别定义的任何属性/方法都将失败:

>>> class X(object):
...     x1 = 1
... 
>>> x = X()
>>> x.x2 = 2
>>> x.__dict__
{'x2': 2}
>>> x.x1
1
>>> x.__dict__['x1']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'x1'

它也不适用于__slots____getattribute__覆盖。

答案 1 :(得分:2)

您还可以考虑使用关键字参数创建dict,例如:

d = dict(name1='foo', name2='bar')

或使用格式的关键字参数:

"{name1} baz {name2}".format(name1='foo', name2='bar')