gpt4 book ai didi

python - PHP 中 python3 的 function_exists

转载 作者:行者123 更新时间:2023-12-01 04:01:50 26 4
gpt4 key购买 nike

有类似 function_exists 的东西吗?在 PHP 中用于 Python3?我正在实现一些允许用户(通过一些 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

主要问题:是否有类似 function_exists 的内容对于Python3,是ast适合这个吗?第二个问题:我应该使用某种规则引擎吗?

关于重复问题报告不,我不检查变量是否存在。我想知道是否有一个具有相同名称的函数作为字符串值。例如,如果我有一个字符串 '_and'我想知道是否有一个名为 _and 的函数,而不是试图弄清楚这个标识符是否 _and实际上是一个函数。

最佳答案

正如 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

但是!对于您的任务,我建议使用一个装饰器来自动将您的函数注册到映射。

_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 语法。

关于python - PHP 中 python3 的 function_exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36355431/

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