Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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过滤器函数_Python_Filterfunction - Fatal编程技术网

带参数的python过滤器函数

带参数的python过滤器函数,python,filterfunction,Python,Filterfunction,假设我有一个ScriptMetadata对象列表 class ScriptMetadata: id = 1 script_name = "test" script_run_start_time = 1 script_run_end_time = 3 .. .. 我想提供一个如下所示的API class ScriptInfoParser: def get_filtered_data(filter_func): [I've logic

假设我有一个ScriptMetadata对象列表

class ScriptMetadata:
  id = 1
  script_name = "test"
  script_run_start_time = 1
  script_run_end_time = 3
  ..
  ..
我想提供一个如下所示的API

class ScriptInfoParser:
    def get_filtered_data(filter_func):
      [I've logic here to obtain a uber list of ScriptMetadata]
      # apply the user supplied filter func on this uber list and return result
      result = filter(filter_func, all_metadata_list)
      return list(result)
如果我想提供一个filter func,以便为我提供script_name为“foo”的ScriptMetadata对象,我可以使用它

    def get_foo_runs(script_metadata):
        if script_metadata.script_name == "foo":
            return script_metadata
print(ScriptInfoParser.get_filtered_data(get_foo_runs))
问题是我如何参数化filter func,这样我就可以有一个可以动态获取参数并应用过滤的函数了

get_script_runs(script_name):
  <?? magic filter func>
  return ScriptInfoParser.get_filtered_data(magic_filter_func) # returns scriptmetadata list that matches script_name
获取脚本运行(脚本名称):

这是一个非常开放的问题,有很多方法可以做到这一点。对各种属性进行过滤的最可读的方法之一可能是将lambda传递到组合函数中

filter_funcs = [
lambda script_metadata: script_metadata.script_name == "foo",
lambda script_metadata: script_metadata.script_run_end_time < 2
]
def apply_filters(script_metadata, filter_funcs):
    for filter_func in filter_funcs:
        if not filter_func(script_metadata):
            return False
    return True
filter\u funcs=[
lambda script\u metadata:script\u metadata.script\u name==“foo”,
lambda脚本\元数据:脚本\元数据。脚本\运行\结束\时间<2
]
def应用过滤器(脚本元数据、过滤器函数):
对于筛选器函数中的筛选器函数:
如果没有筛选函数(脚本元数据):
返回错误
返回真值
您还可以通过使用eval来缩短输入

filter_strs = [
"script_name == 'foo'",
"script_run_end_time < 2",
]
def apply_filters(script_metadata, *args):
    for filter_str in args:
        if not eval(f"script_metadata.{filter_str}"):
            return False
    return True

apply_filters(script_metadata,
              "script_name =='foo'",
              "script_run_end_time < 2")
apply_filters(script_metadata, *filter_strs)
filter\u strs=[
“脚本名称=='foo'”,
“脚本运行结束时间<2”,
]
def apply_过滤器(脚本_元数据,*args):
对于参数中的筛选器_str:
如果不是eval(f“script_metadata.{filter_str}”):
返回错误
返回真值
应用\u筛选器(脚本\u元数据,
“脚本名称=='foo'”,
“脚本\u运行\u结束\u时间<2”)
应用过滤器(脚本元数据,*过滤器)

一种可能的方法是创建一个“模板”对象,该对象以所有值均为
None
开始。然后设置要匹配的值并调用一个
find_matching
函数来比较非
None
的字段。类方法应该有一个
self
参数,除非它们是静态方法。下面是我要说的:回溯(最近一次调用):文件“/Users/kdas/Documents/work/testkdas.py”,第12行,res=ScriptInfoParser。get_filtered_data(apply_filters(filter_funcs))类型错误:apply_filters()缺少1个必需的位置参数:“filter_funcs”]def apply_filters(脚本元数据,过滤器函数):对于过滤器函数中的过滤器函数:如果不是过滤器函数(脚本元数据):返回False返回Trueapply_filters()如上所述,它将脚本和元数据以及过滤器作为参数。您可以使用filter()通过如下绑定参数来使用它:filter(lambda script\u metadata:apply\u filters(script\u metadata,filter\u funcs),metadata\u objects)