【问题标题】:Decorating all functions in a file if variable is set to true in python如果变量在python中设置为true,则装饰文件中的所有函数
【发布时间】: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


【解决方案1】:

我认为你的最终装饰器应该看起来更像这样

def chop_num(num):
    num = str(num)
    num = num[:15]
    return float(num)

chop_flag = True

def decorator(func):
    def wrapper(*args, **kwargs):
        val = func(*args, **kwargs)
        if chop_flag:
            return chop_num(val)
        else:
            return val
    return wrapper

@decorator
def nineteen_digits():
    return 1_000_000_000_000_000_000

print(nineteen_digits())
# 100000000000000.0
chop_flag = False
print(nineteen_digits())
# 1000000000000000000

【讨论】:

  • 谢谢你,这真的很好用!我会接受这个答案。我显然还有很多关于装饰器的事情要弄清楚。 =)
猜你喜欢
  • 1970-01-01
  • 2018-04-07
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多