将Python字符串解释为条件语句?

将Python字符串解释为条件语句?,第1张

将Python字符串解释为条件语句

这应该做您想要的:

from __future__ import print_functionimport astimport operatorimport sysOPERATORS = {    '<': operator.lt,    '<=': operator.le,    '>': operator.gt,    '>=': operator.ge,    '==': operator.eq,    '!=': operator.ne,    # 'in' is using a lambda because of the opposite operator order    # 'in': (lambda item, container: operator.contains(container, item),    'in': (lambda item, container: item in container),    'contains': operator.contains,    }def process_conditionals(conditional_strings, variables):    for conditional_string in conditional_strings:        # Everything after first and op is part of second        first, op, second = conditional_string.split(None, 2)        resolved_operands = []        for raw_operand in (first, second): try:     resolved_operand = ast.literal_eval(raw_operand) except ValueError:  # If the operand is not a valid literal     ve = sys.exc_info()     try:         # Check if the operand is a known value         resolved_operand = variables[raw_operand]     except KeyError:  # If the operand is not a known value         # Re-raise the ValueError         raise ve[1], None, ve[2] resolved_operands.append(resolved_operand)        yield (op, tuple(resolved_operands))def main(lines, *conditional_strings):    for line in lines:        key, category, details = line        variables = { 'key': key, 'category': category, 'elapsed': details['elapsed'], 'jobname': details['jobname'], }        conditionals = process_conditionals(conditional_strings, variables)        try: # You could check each conditional separately to determine # which ones have errors. condition = all(OPERATORS[op](*operands)      for op, operands in conditionals)        except TypeError: print("A literal in one of your conditionals is the wrong type. "       "If you can't see it, try running each one separately.",       file=sys.stderr) break        except ValueError: print("An operand in one of your conditionals is neither a known "       "variable nor a valid literal. If you can't see it, try "       "running each one separately.", file=sys.stderr) break        else: if condition:     print(line)if __name__ == '__main__':    lines = [        [1, 'runtime', {'elapsed': 12.3, 'jobname': 'high38853'}],        [2, 'runtime', {'elapsed': 45.6, 'jobname': 'high38854'}],        [3, 'runtime', {'elapsed': 78.9, 'jobname': 'high38855'}],        [4, 'runtime', {'elapsed': 14.7, 'jobname': 'high38856'}],        [5, 'runtime', {'elapsed': 25.8, 'jobname': 'high38857'}],        [6, 'runtime', {'elapsed': 36.9, 'jobname': 'high38858'}],        [7, 'runtime', {'elapsed': 75.3, 'jobname': 'high38859'}],        ]    conditional_strings = sys.argv[1:]    main(lines, *conditional_strings)

例子

$ ./SO_31999444.py 'elapsed > 30'[2, 'runtime', {'jobname': 'high38854', 'elapsed': 45.6}][3, 'runtime', {'jobname': 'high38855', 'elapsed': 78.9}][6, 'runtime', {'jobname': 'high38858', 'elapsed': 36.9}][7, 'runtime', {'jobname': 'high38859', 'elapsed': 75.3}]$ ./SO_31999444.py 'elapsed > 20' 'elapsed < 50'[2, 'runtime', {'jobname': 'high38854', 'elapsed': 45.6}][5, 'runtime', {'jobname': 'high38857', 'elapsed': 25.8}][6, 'runtime', {'jobname': 'high38858', 'elapsed': 36.9}]$ ./SO_31999444.py 'elapsed > 20' 'elapsed < 50' 'key >= 5'[5, 'runtime', {'jobname': 'high38857', 'elapsed': 25.8}][6, 'runtime', {'jobname': 'high38858', 'elapsed': 36.9}]$ ./SO_31999444.py "'9' in jobname"[7, 'runtime', {'jobname': 'high38859', 'elapsed': 75.3}]$ ./SO_31999444.py "jobname contains '9'"[7, 'runtime', {'jobname': 'high38859', 'elapsed': 75.3}]$ ./SO_31999444.py "jobname in ['high38857', 'high38858']"[5, 'runtime', {'jobname': 'high38857', 'elapsed': 25.8}][6, 'runtime', {'jobname': 'high38858', 'elapsed': 36.9}]$ ./SO_31999444.py "9 in jobname"A literal in one of your conditionals is the wrong type. If you can't see it, try running each one separately.$ ./SO_31999444.py "notakey == 'something'"An operand in one of your conditionals is neither a known variable nor a valid literal. If you can't see it, try running each one separately.$ ./SO_31999444.py "2 == 2"[1, 'runtime', {'jobname': 'high38853', 'elapsed': 12.3}][2, 'runtime', {'jobname': 'high38854', 'elapsed': 45.6}][3, 'runtime', {'jobname': 'high38855', 'elapsed': 78.9}][4, 'runtime', {'jobname': 'high38856', 'elapsed': 14.7}][5, 'runtime', {'jobname': 'high38857', 'elapsed': 25.8}][6, 'runtime', {'jobname': 'high38858', 'elapsed': 36.9}][7, 'runtime', {'jobname': 'high38859', 'elapsed': 75.3}]$ ./SO_31999444.py[1, 'runtime', {'jobname': 'high38853', 'elapsed': 12.3}][2, 'runtime', {'jobname': 'high38854', 'elapsed': 45.6}][3, 'runtime', {'jobname': 'high38855', 'elapsed': 78.9}][4, 'runtime', {'jobname': 'high38856', 'elapsed': 14.7}][5, 'runtime', {'jobname': 'high38857', 'elapsed': 25.8}][6, 'runtime', {'jobname': 'high38858', 'elapsed': 36.9}][7, 'runtime', {'jobname': 'high38859', 'elapsed': 75.3}]

这是一个有趣的小项目:)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5674447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存