Python有一种很好的方法可以用字典进行字符串替换 如何在我自己的对象中复制相同的行为(而不是使用字典)?
In [1]: d = {'hello': 'world'}
In [2]: '%(hello)s' % d
Out[2]: 'world'
例如,如果我有一个班级MyClass
:
In [3]: class MyClass():
a = 'x'
b = 'y'
In [4]: m = MyClass()
没有任何映射,我们希望字符串替换会抛出错误(他们会这样做),但是假设我希望它像{'a' : 'x'}
那样行动,即返回'x'
:
In [5]: '%(a)s' % m
TypeError: format requires a mapping
我一直在使用format string syntax (__format__
)或template string,但没有成功。
如何为我的类提供一个“映射”(字典?)以用于字符串替换?
答案 0 :(得分:3)
您的MyClass()
个实例确实有与之关联的词典,请使用vars()
function访问它:
'%(a)s' % vars(m)
这适用于所有不使用__slots__
属性的自定义类。
或者,您可以使用较新的''.format()
string formatting method,它允许您访问对象属性:
'{0.a}'.format(m)
这种格式化方法可以在您的自定义类中查找.__format__(format_spec)
方法,请参阅format()
function documentation。
最后但并非最不重要的是,任何带有.__getitem__()
method的对象都可以用于字符串格式化,就像它是字典一样:
>>> class Foo(object):
... def __getitem__(self, name):
... if name == 'bar': return 'baz'
... raise AttributeError(name)
...
>>> '%(bar)s' % Foo()
'baz'