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

Python 如何访问传递给修饰函数的参数的各个参数,python,decorator,python-decorators,Python,Decorator,Python Decorators,我试图用一个异常处理函数来修饰5个函数。每个修饰函数都接受不同数量的参数,但都有一个重要的共同参数fname。我想使用这个公共参数,如下例所示 这很接近,但我无法访问fname: def mydeco(func): def wrapper(*args, **kwargs): print(args) #print(fname) <== this fails as well; #Unwrapping args give

我试图用一个异常处理函数来修饰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
def mydeco(func):
def包装(*args,**kwargs):
打印(args)

#print(fname)args是元组下的非关键字参数
kwargs是字典下的关键字参数

它还取决于使用哪一个的目的,在包装函数中,您需要相应地访问它们

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

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

它还取决于使用哪一个的目的,在包装函数中,您需要相应地访问它们

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

包装函数的参数是
*args
**kwargs
lname
fname
参数未在内部函数外的包装中定义

在这个函数调用中

长(‘鲍勃’、‘史密斯’)

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

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

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


然后,关键字参数将作为**kwargs字典传递。它们可以按如下方式访问:
kwargs['fname']
kwargs['lname']
包装函数的参数是
*args
**kwargs
lname
fname
参数未在内部函数外的包装中定义

在这个函数调用中

长(‘鲍勃’、‘史密斯’)

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

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

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

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

“args”只是一个元组,如果它不是空的,则取其第一项。如果为空,则使用字典“kwargs”中的键“fname”。“args”只是一个元组,如果不为空,则取其第一项。如果为空,请使用字典“kwargs”中的键“fname”。