decorator'assign1'按预期创建字典:
decorator'assign2'我试着让字典值成为一个元组,事情变得有点奇怪
d1 = dict()
d2 = dict()
assign1 = lambda d, k: lambda f: d.setdefault(k, f)
assign2 = lambda d, k, s: lambda f: d.setdefault(k, (f,s))
@assign1 (d1, 'FW')
@assign1 (d1, 'PW')
def func1():
pass
@assign2 (d2, 'FW', 'XX')
@assign2 (d2, 'PW', 'XD')
@assign2 (d2, 'DF', 'XC')
def func2():
pass
print ('assign1')
for k in d1:
print ('{0} : {1}'.format( k, d1[k]))
print('assign2')
for k in d2:
print ('{0} : {1}'.format( k, d2[k]))
#Output
assign1
FW : <function func1 at 0x000000000311F400>
PW : <function func1 at 0x000000000311F400>
assign2
DF : (<function func2 at 0x000000000311F510>, 'XC')
FW : (((<function func2 at 0x000000000311F510>, 'XC'), 'XD'), 'XX')
PW : ((<function func2 at 0x000000000311F510>, 'XC'), 'XD')
答案 0 :(得分:1)
这很棘手但是你可以找到:
In [55]: func1()
In [56]: func2()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-57-dff3c14b0386> in <module>()
----> 1 func2()
TypeError: 'tuple' object is not callable
什么?! func2
现在是一个元组???
是的。 setdefault方法返回您设置的值。在第一种情况下它工作,因为你将它设置为func1但在第二种情况下它成为一个元组,并且该元组应用于下一个装饰器,依此类推......