【发布时间】:2017-06-04 01:42:57
【问题描述】:
所以我有一个我要解决的问题,我有两个基本类 CMIX 和 C,其中 CMIX 包含 的实例列表C:[C1, C2, .... Cn] 将由自定义语法操作(字符串值运算符 - “+”、“-”、“”、“(”、“) ",但从某种意义上说,可以将额外的逻辑嵌入到操作中。例如,[C1 + C2 + ... + Cn] 组合将为每个 C1、C2、... 调用 C.foo() Cn,然后然后将这些结果相加。类似地,语法术语与对象集的组合,例如: [C1 "" "(" C1 "+" C2 "*" "( "C2"+"C2")"")"] 会调用 C1.foo(), C2.foo(),然后根据正常的数学评估组合这些结果。最初,我只想处理基本的数学运算,例如* + ( ) 但希望以后能够为自定义(非数学)术语扩展它。
类功能的基本代表性草图如下(这主要是概念性的;尤其是 CMIX,因为我不确定解析语法逻辑的最佳方法)
class CMIX():
self.C_list = [] # List of instances of type C
self.grammar = []
def my_val(self, val):
## call every .foo(val=val) in self.C_list, and apply the grammar rules accordingly.
class C():
def __init__(self, location):
self.location= location
def my_val(self, val):
return val * 2
def check_location(self):
if self.location == "antarctica":
return "cold"
elif self.location == "moon":
return "bouncy"
else:
return "lost"
例如,假设我们定义了全局语法运算符
+ 表示如果 C.check_location() == "lost" 则返回 -100*C.my_val(val) 否则只返回 C.m
语法说 C1 + C2 和 C1.location="lost", C2.location="antarctica",那么 CMIX.my_val(20) 的计算结果为:-100*C1.my_val(20) + C2。我的_val(20)
在 python 中是否有现有的简单方法可以做到这一点?或者也许是一个轻量级库,允许创建此类评估规则。例如,我发现了https://github.com/pydata/numexpr,但这直接适用于数据类型,而它应该适用于对象层,应用自定义逻辑,然后执行标准的数学语法操作顺序。
非常感谢任何尝试这样做的方向! 问候
【问题讨论】:
-
虽然您可能正在寻找的是运算符重载,但您并不清楚您在问什么。
-
这个“语法”从何而来,为什么称它为语法?它似乎与解析或语法没有太大关系。听起来你可以让“语法”成为一个函数。
-
@user2357112 一种语法,它定义了一组操作,每个操作对相同的项目类型执行相同的任务。这难道不是语法吗?一组规则,确定某些事物如何相互组合。在这种情况下,事物是一个类,结构化规则集是在另一层(一致)逻辑之上的数学运算。函数只是语法的一部分。数学评估有自己的语法。我想知道是否有现有的解决方案,所以我不会重新发明轮子。也许fdik.org/pyPEG
-
@pvg 这是一个选项,我现在可能不得不使用它,但我更喜欢不一定限于现有运营商的东西
-
你看过ply吗?