我想我在你的答案中看到的主要缺点是,它还没有处理原始的复合字段名称语法,例如0.name为’getattr’/’dot’操作符访问,0 [name]用于’getitem’检索指定在PEP 3101中.
这是一个适用于Python 2.7和3.3的版本.一个主要的实现差异是它覆盖了get_value()方法而不是get_field().
虽然它在如何检测get_value()方法中的调用方面有点hacky,但我认为它不会被认为是病态的. 😉
from __future__ import print_function
from string import Formatter
class CallFormatter(Formatter):
try: # deal with Py 2 & 3 difference
NUMERICS = (int, long)
except NameError:
NUMERICS = int
def get_value(self, key, args, kwargs):
if key.endswith('()'): # call?
return kwargs[key[:-2]]()
elif isinstance(key, self.NUMERICS):
return args[key]
else:
return kwargs[key]
if __name__ == '__main__':
fmt = CallFormatter()
def cabbages():
return 'hello'
d = dict(name='Fred')
class Thing(object):
def __init__(self, value):
self.attr = value
th = Thing(42)
print('d[name]:{d[name]}, th.attr:{th.attr}, '
'cabbages:{cabbages}'.format(**locals()))
print(fmt.format('d[name]:{d[name]}, th.attr:{th.attr}, '
'cabbages:{cabbages}, cabbages():{cabbages()}',
**locals()))
输出:
d[name]:Fred, th.attr:42, cabbages:
d[name]:Fred, th.attr:42, cabbages:,
cabbages():hello