在调用python函数之前存储字段要求



我有一本很大的字典,里面有很多键。我需要使用某些字段来计算KPI。是否有方法存储KPI计算所需的字段并删除所有其他字段?理想情况下,我只想在读取时这样做,这样如果我不打算使用这些字段,我甚至不会加载它们。有些用户会直接使用这些函数,所以我不想把它们包装在一个必须实例化的类中,而另一些用户则会同时调用几个KPI。

data = {
A : some values...
.
. 
.
Z : some values... 
}
def foo(dict): 
# requires field A
def bar(dict): 
# requires field B

kpis_to_calculate = [foo, bar]
requirements = set(requirements(foo) -> returns A, requirements(bar) -> returns B)
min_data_needed = filter(data, requirements)

我想出的一种方法是包装函数,例如,但这个解决方案是丑陋的


def _foo(dict): 
# requires field A
def _bar(dict): 
# requires field B
foo = setattr(_foo, '__requires__', 'A')
bar = setattr(_bar, '__requires__', 'B')
kpis = [foo, bar]
requires = [requirement for requirement in func.__requires__ for func in kpis]
# only loads fields needed
load(data_src, required_fields=requires)

在这种情况下,我会使用装饰器:

def requires(*requirements):
def _decorator(f):
f.__requires__ = requirements
return f
return _decorator

@requires('A')
def foo(d):
...
@requires('B')
def bar(d):
...

kpis = [foo, bar]
requirements = [req for func in kpis for req in func.__requires__]
load(data_src, required_fields=requirements)

注:

  1. 我们不需要setattr,因为属性是一个常量
  2. setattr返回None,它不返回原始对象
  3. 注意列表理解中嵌套循环的顺序

最新更新