python3的PHP中存在函数\u

2024-04-18 17:31:15 发布

您现在位置:Python中文网/ 问答频道 /正文

Python3的PHP中有类似于^{}的东西吗?我正在实现一些东西,允许用户(通过一些web UI)在JSON中定义简单的规则,如下所示(在一些奇怪的类似lisp的结构中):

["_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是否实际上是一个函数。你知道吗


Tags: andlambda函数字符串importjsonreturnvalue
1条回答
网友
1楼 · 发布于 2024-04-18 17:31:15

正如Morton所指出的,您可以使用globals()locals()来使用包含名称的字符串获取变量。你知道吗

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

但是!对于您的任务,我建议使用一个decorator,它可以自动将您的函数注册到映射。你知道吗

_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

所以你的function_exists就是

_mapping[key]

AST适用于检查从解析的python源代码生成的语法树,修改现有的语法树并生成新的语法树,以及通过从它生成语法树(举几个例子)从不同的语言转换到python。所以在某种程度上,您可以从JSON生成AST并编译它。我相信Hy实际上就是这么做的,虽然不是来自JSON,而是完整的lisp语法。你知道吗

相关问题 更多 >