我要编写一个接受参数的函数装饰器,并返回一个装饰器,该装饰器可用于控制单参数函数的参数类型。如果传递的参数类型错误,我预计会出现一个引发错误。
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)
应该会出现错误。但是它总是会引发类型错误。
答案 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中曾经历过类似的兔子漏洞),因此根据您的用例,我可能会建议两个选项:
mypy
static type checker。pydantic
软件包。它允许您创建“类结构”对象(类似于NamedTuple
或dataclass
),这些对象将强制执行运行时类型检查,并使用Python 3.6+类型提示在运行时适当地强制输入。 here可以找到文档和一些有用的示例。根据您的用例,我希望这两种帮助之一!