Python装饰器创建字典

时间:2016-07-30 23:15:19

标签: python-decorators

装饰好玩! 我想创建一个'函数调度字典'

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')

1 个答案:

答案 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但在第二种情况下它成为一个元组,并且该元组应用于下一个装饰器,依此类推......