1

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'}ie 具有以下 return 'x'

In [5]: '%(a)s' % m
TypeError: format requires a mapping

我一直在搞乱格式字符串语法 ( __format__)模板字符串,但没有成功。

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

4

1 回答 1

3

您的MyClass()实例确实有一个与之关联的字典,请使用以下vars()函数访问它:

'%(a)s' % vars(m)

这适用于所有不使用__slots__属性的自定义类。

或者,您可以使用更新的''.format()字符串格式化方法,它允许您访问对象属性:

'{0.a}'.format(m)

正是这种格式化.__format__(format_spec)方法在您的自定义类上查找方法,请参阅format()函数文档

最后但同样重要的是,任何具有.__getitem__()方法的对象都可以用于字符串格式化,就好像它是一个字典一样:

>>> class Foo(object):
...     def __getitem__(self, name):
...         if name == 'bar': return 'baz'
...         raise AttributeError(name)
... 
>>> '%(bar)s' % Foo()
'baz'
于 2013-03-02T17:05:05.527 回答