function_exists in PHP for python3
本问题已经有最佳答案,请猛点这里访问。
python3的php中是否有类似于
1 | ["_and", ["_tautology"], ["tautology"]] |
并希望将其转换为python语句,例如这些函数
1 2 3 4 5 6 7 8 | import operator from functools import reduce def _and(*args): return lambda context: reduce(operator.and, [arg(context) for arg in args], True) def _tautology(*_): return lambda *__: True |
把原来的JSON规则转换成
1 | _and(_tautology(), _tautology()) |
只是出于好奇,
1 | mapping = {'_and': _and} |
列表将不断增长,这将导致更多的代码类型化来描述字符串值的含义,而不是实现它们。或者我应该使用另一个规则引擎?因为其中一条规则看起来像
1 2 | ["_and", ["_equals","fieldA","some_value"], ["_equals","fieldB","some_other_value"]] |
假设
1 2 | def _equals(field_name, value): return lambda context: context[field_name] == value |
使规则扩展到
1 2 | _and(_equals('fieldA', 'some_value'), _equals('fieldB', 'some_other_value')) |
DR
主要问题:对于python3,是否有类似于
关于重复问题报告"否",我不检查是否存在变量。我想知道是否有一个与字符串值相同的函数。例如,如果我有一个字符串EDOCX1,5,我想知道是否有一个名为EDCOX1(6)}的函数,而不是想弄清楚这个标识符EDCOX1(6)是否实际上是一个函数。
正如莫尔顿指出的,可以使用EDCOX1 0和EDCOX1 1来使用包含名称的字符串来提取变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 | In [32]: a = 1 In [33]: def b(): c = 2 print(globals()['a']) print(globals()['b']) print(locals()['c']) ....: In [34]: b() 1 <function b at 0x7f425cae3ae8> 2 |
但是!对于您的任务,我建议使用自动将函数注册到映射的装饰器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | _mapping = {} def register(f): _mapping[f.__name__] = f return f @register def _and(*args): return lambda context: reduce(operator.and_, [arg(context) for arg in args], True) @register def _tautology(*_): return lambda *_: True |
所以你的
1 | _mapping[key] |
AST适用于检查从解析的python源代码生成的语法树,修改现有的语法树并生成新的语法树,并通过从不同的语言生成语法树(列举一些用法)传播到python。所以在某种程度上,可以从JSON生成AST并编译它。我相信这实际上是hy所做的,虽然不是来自json,而是全面的lisp语法。