对象的字符串替换(非字典)

时间:2013-03-02 17:02:45

标签: python string

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,但没有成功。

如何为我的类提供一个“映射”(字典?)以用于字符串替换?

1 个答案:

答案 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'