我猜主要的不足我在你的答案看到的是,它不也處理原始化合物的字段名的語法像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真的,我實際上使用不同的字典,例如(一個可憐的選擇)。 –