我有一个包含模块pymetrics.py
的包:
from .utils import minSample
MIN_SIZE = 10
@minSample(MIN_SIZE)
def inventory(df):
'''for quantisation'''
return len(df)
(以及使用相同装饰器的许多其他指标)
…以及utils.py
:
def minSample(sample=None):
def decorator(method):
@wraps(method)
def f(*args, **kwargs):
if len(args[0]) < sample:
return None
return method(*args, **kwargs)
return f
return decorator
现在,在我的生产代码(包外)中,我想更改最小样本大小(minu-size),以便它将影响所有修饰函数:在特定情况下,我可以将minu-size=0
然而,我不知道怎么做
import pandas as pd
from package import pymetrics as mtr
mtr.MIN_SIZE = 0
test = pd.DataFrame({'price': [10, 20, 10], 'name': ['foo', 'bar', 'baz']})
mtr.inventory(test)
>>> None
当
import
行完成时,所有函数都已定义。现在改变已经太晚了。然而,您可以做的是更改定义装饰器的方式,以便它可以接受更改。例如,您可以将其设置为一个类:在
__call__
方法中,可以使用self.MIN_SIZE
和self.function
放置所有的装饰器代码。如果要更改MIN_SIZE
,只需更改类变量:这样,装饰器就不会附加到原始的
MIN_SIZE
,而是可以在整个代码中根据需要进行多次更新。您甚至可以更新单个函数:尽管上面的答案是绝对正确的,但我最终还是使用了带有附加参数的decorator,因为它看起来更透明
相关问题 更多 >
编程相关推荐