蟒蛇多个装饰更改参数

蟒蛇多个装饰更改参数

问题描述:

我试着去了解蟒蛇装饰,但我表现出这种奇怪的行为 在这段代码我已经尝试使用多种装饰为改变我的功能流程蟒蛇多个装饰更改参数

这是代码

def myfilter(f): 
    def decorator(data): 
     if data['num'] %2 == 0: 
      data['num'] = 90 
     f(data) 

    return decorator 

def myduplicator(f): 
    def decorator(data): 
     print 'duplicator data', data 
     f(data) 
     print 'duplicator data', data 
     f(data) 
    return decorator 

@myduplicator 
@myfilter 
def testone(data): 
    print data 

for i in range(3): 
    testone({'num': i}) 

这就是答案

duplicator data {'num': 0} 
{'num': 90} 
duplicator data {'num': 90} 
{'num': 90} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 2} 
{'num': 90} 
duplicator data {'num': 90} 
{'num': 90} 

为什么装饰的myduplicator第二个电话有变更数据导致

print 'duplicator data', data 
f(data) 

的结果,我想是

duplicator data {'num': 0} 
{'num': 90} 
duplicator data {'num': 0} 
{'num': 90} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 2} 
{'num': 90} 
duplicator data {'num': 2} 
{'num': 90} 

因为那是装饰做什么。它改变了字典。由于您使用了相同的字典两次,它已被第一次调用修改。

应用这两个装饰后,你testone功能等同于以下内容:

def testone(data): 
    print 'duplicator data', data 
    if data['num'] %2 == 0: 
     data['num'] = 90 
    print(data) 
    print 'duplicator data', data 
    if data['num'] %2 == 0: 
     data['num'] = 90 
    print(data) 

你可以在这里看到,同样data被修改两次。

现在,如果我运行这个功能它提供了类似的结果:

>>> for i in range(3): 
...  testone({'num': i}) 
duplicator data {'num': 0} 
{'num': 90} 
duplicator data {'num': 90} 
{'num': 90} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 2} 
{'num': 90} 
duplicator data {'num': 90} 
{'num': 90} 
+0

如果我想套用如下装饰两次我能做些什么?我必须做一个燕子副本结构/字典? –