Skip to main content
 首页 » 编程设计

python之在元组中返回装饰器参数和参数

2025年05月04日17zhengyun_ustc

我有以下装饰器和类。

def auth(fn): 
 
    def check_headers(self): 
        print 'checking headers...' 
        #self.headers work done here 
 
    def inner(self, *args, **kwargs): 
        check_headers(self) 
        fn(self, args, kwargs) 
 
    return inner 
 
class Worker(object): 
 
    @auth 
    def work(self, *args, **kwargs): 
        print 'auth passed' 
        print args 
        print kwargs 
 
 
worker_obj = Worker() 
worker_obj.work('arg', kw='kwarg') 

哪些输出:

> checking headers... 
> auth passed 
> (('arg',), {'kw': 'kwarg'}) 
> {} 

但我是否期待这个:

> checking headers... 
> auth passed 
> ('arg',) 
> {'kw': 'kwarg'} 

当原始方法 (work()) 正在运行时,args/kwargs 如何被放入一个元组中,装饰后?

我知道把它剥离成

def auth(fn): 
    return fn 

正确返回参数,但我需要在返回之前对工作实例(self)做一些工作。我肯定错过了一些关于装饰器的东西。

谢谢!

请您参考如下方法:

当您调用 fn(self, args, kwargs) 时,您传递了两个位置参数:args 的元组和 kwargs< 的字典。因此,如果您调用 work(1, x=2),您将调用 func(self, (1,), {'x': 2})。要将 original args 和 kwargs 扩展为单独的参数,您需要做

fn(self, *args, **kwargs) 

这意味着当您调用 work(1, x=2) 时,您也会调用 fn(self, 1, x=2)。

您可以查看有关此 here 的文档.