Python3的PHP中有类似于^{
["_and", ["_tautology"], ["tautology"]]
并希望将其转换为python语句,例如这些函数
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规则变成
_and(_tautology(), _tautology())
只是出于好奇,ast
是为这种任务设计的吗?我以前做过一次,但我正在寻找的东西是可扩展的。因为在这之前我所做的实际上是维护一本像下面这样的字典
mapping = {'_and': _and}
而且这个列表会不断增长,这会导致更多的代码类型化来描述字符串值的含义,而不是实现它们。或者我应该用另一个规则引擎?因为其中一条规则
["_and", ["_equals", "fieldA", "some_value"],
["_equals", "fieldB", "some_other_value"]]
假设_equals
是
def _equals(field_name, value):
return lambda context: context[field_name] == value
这样规则就扩展到
_and(_equals('fieldA', 'some_value'),
_equals('fieldB', 'some_other_value'))
TL;DR
主要问题:Python3是否有function_exists
这样的东西,ast
是否适合这个?
第二个问题:我应该使用某种规则引擎吗?你知道吗
关于重复问题报告否,我不检查是否存在变量。我想知道是否有一个函数与字符串值同名。例如,如果我有一个字符串'_and'
,我想知道是否有一个名为_and
的函数,而不是试图弄清楚这个标识符_and
是否实际上是一个函数。你知道吗
正如Morton所指出的,您可以使用
globals()
和locals()
来使用包含名称的字符串获取变量。你知道吗但是!对于您的任务,我建议使用一个decorator,它可以自动将您的函数注册到映射。你知道吗
所以你的
function_exists
就是AST适用于检查从解析的python源代码生成的语法树,修改现有的语法树并生成新的语法树,以及通过从它生成语法树(举几个例子)从不同的语言转换到python。所以在某种程度上,您可以从JSON生成AST并编译它。我相信Hy实际上就是这么做的,虽然不是来自JSON,而是完整的lisp语法。你知道吗
相关问题 更多 >
编程相关推荐