我想我在您的回答中看到的主要缺陷是它不处理原始复合字段名称语法,例如0.name
用于“getattr”/“dot”运算符访问,也不0[name]
用于 PEP 3101 中指定的“getitem”检索。
这是一个适用于 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:<function cabbages at 0x00BB05F0>
d[name]:Fred, th.attr:42, cabbages:<function cabbages at 0x00BB05F0>,
cabbages():hello