gpt4 book ai didi

python - 如何执行存储为字符串的 bool 逻辑,最好不使用 eval()?

转载 作者:行者123 更新时间:2023-12-04 07:30:59 24 4
gpt4 key购买 nike

我有以下 YAML 文件,其中包含匹配文件名的解析逻​​辑:

rules_container = """
file_name:
rule_1: {module: str, method: startswith, args: [s_]}
rule_2: {module: str, method: endswith, args: [.log]}
logic: rule_1 and rule_2
"""
我加载它并得到以下映射:
>>> import yaml
>>> import pprint
>>> d_yml = yaml.safe_load(rules_container)
>>> pprint.pprint(d_yml)
{'file_name': {'logic': 'rule_1 and rule_2',
'rule_1': {'args': ['s_'],
'method': 'startswith',
'module': 'str'},
'rule_2': {'args': ['.log'],
'method': 'endswith',
'module': 'str'}}}
下面的函数帮助我解析上面的规则,最终我得到:
  • 编译规则字典
  • 将规则应用于字符串(即文件名)的逻辑

  • def rule_compiler(module, method, args=None, kwargs=None):

    def str_parser(string):
    return getattr(string, method)(*args)

    return str_parser
    def rule_parser(container):

    compiled_rules = {
    k:rule_compiler(**v) for k,v in container.items() if k.startswith('rule')
    }

    logic = container.get('logic', None)

    return compiled_rules, logic
    注意:我没有使用 modulekwargs在这里,但它们在配置文件的其他地方用于其他规则。
    所以,如果我调用 rule_parser()在规则的容器上,我得到了这个:
    >>> rp = rule_parser(d_yml['file_name'])
    >>> print(rp)
    ({'rule_1': <function __main__.rule_compiler.<locals>.str_parser(string)>,
    'rule_2': <function __main__.rule_compiler.<locals>.str_parser(string)>},
    'rule_1 and rule_2')
    如果我尝试使用每个规则解析字符串,它们会按预期工作:
    >>> fname = 's_test.out'
    >>> rp[0]['rule_1'](fname)
    True
    >>> rp[0]['rule_2'](fname)
    False
    我想应用“逻辑”定义的逻辑并得到这个:
    >>> rp[0]['rule_1'](fname) and rp[0]['rule_2'](fname)
    False
    我已经想到了一种方法,通过解析包含 bool 逻辑的字符串,将其转换为与上述类似的内容,然后调用 eval()在上面。
    你能想到其他不涉及 eval()的方式吗? ?
    注意:可能有两个以上的规则,所以用简单的“和/或”替换逻辑,然后使用某种 if确定应用哪一个的声明也不起作用。
    注意:在这种特定情况下,使用正则表达式并完全消除对多个规则的需要不是一种选择。
    谢谢!

    最佳答案

    这是一个想法,使用 pandas.eval ,不确定它是否适合您的情况。

    import pandas as pd

    fname = 's_test.out'
    rule, logic = rp

    def apply_rule(rule_dict: dict, fname: str) -> dict:
    return {rule: func(fname)
    for rule, func in rule_dict.items()}

    print(pd.eval(logic, local_dict = apply_rule(rule, fname)))
    输出:
    False

    关于python - 如何执行存储为字符串的 bool 逻辑,最好不使用 eval()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67927874/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com