[英]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.