繁体   English   中英

带有参数的python装饰器函数

[英]python decorator function with arguments

我已经阅读并理解了有关函数装饰器的这篇文章: https : //www.artima.com/weblogs/viewpost.jsp? thread =240845特别是,我正在谈论“带有装饰器参数的装饰器函数”部分

不过,我遇到了一个问题。 我正在尝试编写带有参数的装饰器函数,以将参数修改为类构造函数。 我有两种写方法。

首先是一些进口:

import scipy.stats as stats
import numpy as np

方法1(类似于上述文章的示例):

def arg_checker1(these_first_args):
    def check_args(func):
        def wrapped(*args):
            for arg in args[:these_first_args]:
                assert isinstance(arg, np.ndarray) and arg.ndim == 2
            return func(*args) 
        return wrapped
    return check_args

或方式2:

def arg_checker2(these_first_args, func):
    def wrapped(*args):
        for arg in args[:these_first_args]:
            assert isinstance(arg, np.ndarray) and arg.ndim == 2
        return func(*args) 
    return wrapped

我只希望当函数的第一个'these_first_args'不是2-d np数组时抛出错误。 但是看看当我尝试使用它时会发生什么(不是使用@而是直接将其用作函数)

class PropDens1:
    def __init__(self, samp_fun):
        self.samp = arg_checker1(samp_fun, 2) #right here

class PropDens2:
    def __init__(self, samp_fun):
        self.samp = arg_checker2(2, samp_fun) #right here

q_samp = lambda xnm1, yn, prts : stats.norm.rvs(.9*xnm1,1.,prts)
q1 = PropDens1(q_samp) #TypeError: arg_checker1() takes exactly 1 argument (2 given)
q2 = PropDens2(q_samp) #no error

第二个似乎可以举几个例子。 但是,有没有更好的方法呢? 如果没有,为什么这样做呢?

我认为这就是为什么我不明白这一点。 这是该链接文件中的示例:

def decoratorFunctionWithArguments(arg1, arg2, arg3):
    def wrap(f):
        print "Inside wrap()"
        def wrapped_f(*args):
            print "Inside wrapped_f()"
            print "Decorator arguments:", arg1, arg2, arg3
            f(*args)
            print "After f(*args)"
        return wrapped_f
    return wrap

他为什么实际上不必将要包装的函数(在这种情况下为f)作为参数传递给decoratorFunctionWithArguments()?

唯一的例外是告诉您出了什么问题。 您使用2个args调用arg_checker1 ,但仅定义了1个。 您应该写:

self.samp = arg_checker1(2)(samp_fun)

这有点等同于:

@arg_checker1(2)
def q_samp(...):
    ...

无论如何,您应该采用第一种方式,因为它可以使用@语法正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM