如何访问传递给修饰函数的参数的各个参数

How to access individual arguments of args passed to decorated function

我正在尝试用异常处理函数修饰 5 个函数。每个装饰函数都将接受不同数量的参数,但所有函数都有一个重要的共同参数,fname。我想使用该通用参数,如下例所示。

这很接近,但我无法访问 fname:

def mydeco(func):
    
    def wrapper(*args, **kwargs):
    
        print(args)
        #print(fname) <== this fails as well;
        #Unwrapping args gives 'SyntaxError: can't use starred expression here'
               
        try:
            print('Before func')
            answer = func(*args,**kwargs)
            print('after func in wrapper')
            if answer == 2:
                print(f"Great job {fname}")
        except Exception as e:
            print('blah', e)
    
    return wrapper


@mydeco
def long(fname, lname):
    print(f"hello {fname} {lname}")
    return 2

@mydeco
def short(fname):
    print(f"hello {fname}")



short('Bob')
long('Bob', 'Smith')

('Bob',)
Before func
hello Bob
after func in wrapper
('Bob', 'Smith')
Before func
hello Bob Smith
after func in wrapper
blah name 'fname' is not defined

我离题了吗?

args 是元组下的非关键字参数
kwargs 是字典下的关键字参数

这也取决于使用哪个的目的,在包装函数中你需要相应地访问它们。

long('Bob', 'Smith') # args = ('Bob', 'Smith') kargs = []
long(fname='Bob',lname='Smith') # args = () kargs= ['fname':'Bob', 'lname'='Smith']

包装函数的参数是*args**kwargslnamefname 参数未在内部函数外部的包装器中定义。

在这个函数调用中

long('Bob', 'Smith')

位置参数作为 *args 元组传递 。它们可以在包装器中按如下方式访问:args[0]args[1].

或者,如果您将函数调用更改为

long(fname = 'Bob', lname = 'Smith')

然后关键字参数将作为**kwargs字典。它们可以按如下方式访问:kwargs['fname']kwargs['lname'].