Python 3.x Python:如何在decorator中找到包装的函数参数?
我写了一篇文章,大意如下:Python 3.x Python:如何在decorator中找到包装的函数参数?,python-3.x,Python 3.x,我写了一篇文章,大意如下: from functools import wraps def mark_something(f): @wraps(f) def decorated(*args, **kwargs): # How do I find the pd.DataFrame parameter of the decorated function? # df = args[<pos_1>] or kwargs['df']
from functools import wraps
def mark_something(f):
@wraps(f)
def decorated(*args, **kwargs):
# How do I find the pd.DataFrame parameter of the decorated function?
# df = args[<pos_1>] or kwargs['df']
df = df.apply(lambda x: ...)
return f(*args, **kwargs)
return decorated
从functools导入包装
def mark_某物(f):
@包装(f)
def装饰(*args,**kwargs):
#如何找到修饰函数的pd.DataFrame参数?
#df=args[]或kwargs['df']
df=df.apply(λx:…)
返回f(*args,**kwargs)
回报
包装方法接收一个DatFrame
参数作为第二个参数
问题是调用方可以执行foo(something,my_-df)
,然后我需要查看args
,或者foo(something,df=my_-df)
,我需要查看kwargs
是否有一种“好”的方法可以在包装函数中找到参数,而不必显式地检查字典和列表
编辑
我尝试了
kwargs.get('df',args[1])
,但由于args
只有一个项目,因此引发了一个错误。。。我认为可选部分只有在get失败的情况下才被评估。。因为您的decorator非常具体,即它有一个数据帧和一个非关键字参数,您可以在decorator方法中使用正确的参数签名
def wrapper(fun):
def working(a, kwd=None):
print("arg: ", a)
print("kwarg: ", kwd)
return fun(a, kwd)
return working
@wrapper
def testme(a, kwd=None):
print("running: ", a, kwd)
testme(1, 2)
testme(1, kwd=3)
然后输出为:
arg:1夸格:2
跑步:12
arg:1
夸格:3
跑步:13
当然,可以通过从functools添加
@wrapps
来改进这一点,但我认为这一想法是有道理的。您能否举例说明您实际希望如何使用它?具体地说,什么是foo以及您是如何声明它的。另外,what iswrapps
您可能应该包括该定义/从何处获得它。”我认为可选部分只有在get失败时才进行计算“不,您正在使用两个参数进行方法调用,这两个参数都需要解析。您可以使用集合中的defaultdictz=defaultdict(lambda:args[1])
那么args[1]在z需要默认查找之前不会被检查。您的建议会限制对具有完全相同签名的方法使用decorator,对吗?(参数名称也是?@mibm是的,但您的要求似乎是需要一个数据帧。您可以捕获剩余的参数等。