【发布时间】:2018-06-18 22:25:21
【问题描述】:
我有密码
chop_flag = True
def decorator(func):
def chop_num(num):
num = str(num)
num = num[:15]
return float(num)
return chop_num
def decorator2():
return decorator if chop_flag else break
然后在我程序中的每个函数之前添加@decorator2。这会产生类型错误(“decorator2() 采用 0 个位置参数,但给出了 1 个”),我也很确定这不是我想做的事情的好方法。
总结一下:如果chop_flag = True,我正在尝试获取程序中每个函数的输出并通过chop_num() 函数运行它;如果chop_flag = False,我希望它忽略装饰器。我想我会通过对每个函数应用一个装饰器来做到这一点。任何帮助将不胜感激。
更新代码:
chop_flag = True
def decorator(func):
if chop_flag == True:
def chop_num(num, *args, **kwargs):
num = func(*args, **kwargs)
num = str(num)
num = num[:15]
return float(num)
return chop_num
else:
return
它现在可以正常运行,但是当我将文件导入解释器(例如)并调用 add 函数时,即使我输入了两个参数,它也会显示“add() missing 1 required positional argument”。
【问题讨论】:
-
你不能定义一个普通的装饰器来应用到每个函数,并在其中测试
chop_flag来决定装饰器是否有任何作用? -
@ScottHunter 那会......更有意义,是的。我试试看,谢谢。
-
@ScottHunter 所以它的工作原理是没有任何东西会立即被破坏,但我有一个新问题——chop_num 函数在我应用装饰器的函数的输入上运行,而不是输出.
-
你从来没有真正在
chop_num中调用func。 -
@PatrickHaugh 当我尝试这样做时,它说它使用的各种函数缺少“必需的位置参数”。我在其他地方看到使用了 *args 和 **kwargs,它只是返回一个名称错误:“args is not defined”。
标签: python python-3.x python-decorators