Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python:如何在decorator中找到包装的函数参数?_Python 3.x - Fatal编程技术网

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 is
wrapps
您可能应该包括该定义/从何处获得它。”我认为可选部分只有在get失败时才进行计算“不,您正在使用两个参数进行方法调用,这两个参数都需要解析。您可以使用集合中的defaultdict
z=defaultdict(lambda:args[1])
那么args[1]在z需要默认查找之前不会被检查。您的建议会限制对具有完全相同签名的方法使用decorator,对吗?(参数名称也是?@mibm是的,但您的要求似乎是需要一个数据帧。您可以捕获剩余的参数等。