我正在尝试编写一个获得单个 arg 的装饰器,即
@Printer(1)
def f():
print 3
所以,我天真地尝试了:
class Printer:
def __init__(self,num):
self.__num=num
def __call__(self,func):
def wrapped(*args,**kargs):
print self.__num
return func(*args,**kargs**)
return wrapped
这没问题,但它也可以作为不接收任何参数的装饰器,即
@Printer
def a():
print 3
我怎样才能避免这种情况?
请您参考如下方法:
好吧,它已经被有效地阻止了,因为调用 a() 不起作用。
但是要在定义函数时停止它,我想你必须更改 __init__ 以检查 num 的类型:
def __init__(self,num):
if callable(num):
raise TypeError('Printer decorator takes an argument')
self.__num=num
不过,我不知道这是否真的值得。它已经不能按原样工作了;您实际上是在要求以鸭子类型的语言强制执行参数类型。
