Skip to main content
 首页 » 编程设计

Python之装饰器接收单个 arg 的歧义

2025年05月04日14bjzhanghao

我正在尝试编写一个获得单个 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 

不过,我不知道这是否真的值得。它已经不能按原样工作了;您实际上是在要求以鸭子类型的语言强制执行参数类型。