如何将参数传递给python装饰器

时间:2019-12-20 15:23:59

标签: python

我要编写一个接受参数的函数装饰器,并返回一个装饰器,该装饰器可用于控制单参数函数的参数类型。如果传递的参数类型错误,我预计会出现一个引发错误。

def typecontrol(num_type): 
    def wrapper_function(num):
        if isinstance(num, num_type):
            return num
        else:
            raise TypeError

    return wrapper_function

@typecontrol(float)
def myfunc(num):
    print(num)

例如,我希望myfunc(9.123)应该打印9.123,而myfunc(9)应该会出现错误。但是它总是会引发类型错误。

2 个答案:

答案 0 :(得分:2)

menuOpened将是返回装饰器的功能,而不是装饰器本身。您需要一个额外的嵌套函数:

typecontrol

如果类型检查通过,则包装器函数将负责调用包装的函数,而不是返回经过类型检查的参数。

在编写的代码中,def typecontrol(num_type): def decorator(f): def wrapper_function(num): if isinstance(num, num_type): f(num) else: raise TypeError return wrapper_function return decorator @typecontrol(float) def myfunc(num): print(num)实际上是您要修饰的函数,因此您要检查一个函数是否是num的实例(在这种情况下)。

一些例子:

float

答案 1 :(得分:0)

正如其他人所评论的,here找到了关于编写带有参数的装饰器的很好解释。

但是,似乎您想强制执行类型(之前我在Python中曾经历过类似的兔子漏洞),因此根据您的用例,我可能会建议两个选项:

  1. 如果要确保在运行时之前输入正确的程序,请使用mypy static type checker
  2. 如果您需要在运行时解析/验证输入值,我强烈建议您使用pydantic软件包。它允许您创建“类结构”对象(类似于NamedTupledataclass),这些对象将强制执行运行时类型检查,并使用Python 3.6+类型提示在运行时适当地强制输入。 here可以找到文档和一些有用的示例。

根据您的用例,我希望这两种帮助之一!