带参数的python过滤器函数

2024-09-30 12:28:20 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个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

此外,我还想变得复杂,即不止一个参数,例如为script\u name=“foo”和script\u run\u end\u time提供scriptmetadata项<;2等

谢谢你的帮助


Tags: runnamedatagetreturnfootimescript
1条回答
网友
1楼 · 发布于 2024-09-30 12:28:20

这是一个非常开放的问题,有很多方法可以做到这一点。对各种属性进行过滤的最可读的方法之一可能是将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

您还可以通过使用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)

相关问题 更多 >

    热门问题