python 带参数的过滤函数
python filter function with arguments
假设我有一个 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)
如果我想提供一个过滤器函数,以便为我提供 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))
问题是如何参数化过滤器函数,以便我可以拥有一个可以动态获取参数并应用过滤的函数
get_script_runs(script_name):
<?? magic filter func>
return ScriptInfoParser.get_filtered_data(magic_filter_func) # returns scriptmetadata list that matches script_name
我还想变得复杂,即不止一个参数,例如给我 script_name="foo" 和 script_run_end_time < 2 等
的脚本元数据项
感谢任何帮助
这是一个非常开放的问题,有很多方法可以实现。过滤各种属性的最易读的方法之一可能是将 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)
假设我有一个 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)
如果我想提供一个过滤器函数,以便为我提供 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))
问题是如何参数化过滤器函数,以便我可以拥有一个可以动态获取参数并应用过滤的函数
get_script_runs(script_name):
<?? magic filter func>
return ScriptInfoParser.get_filtered_data(magic_filter_func) # returns scriptmetadata list that matches script_name
我还想变得复杂,即不止一个参数,例如给我 script_name="foo" 和 script_run_end_time < 2 等
的脚本元数据项感谢任何帮助
这是一个非常开放的问题,有很多方法可以实现。过滤各种属性的最易读的方法之一可能是将 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)