我猜主要的不足我在你的答案看到的是,它不也处理原始化合物的字段名的语法像0.name
为“GETATTR” /“点”操作员访问,也没有。 ,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
使用'str.format()'和'当地人()'通常是一个非常糟糕的主意。只需传递你想要的值。 –
@Lattyware真的,我实际上使用不同的字典,例如(一个可怜的选择)。 –