解析类实例的方法与自定义的语法在Python

问题描述:

所以我我试图解决其中我有两个基础类CMIXç问题,因此CMIX包含Ç实例的列表: [C1,C2,... Cn]将由一个自定义语法(字符串值操作符 - “+”,“ - ”,“”,“(”,“)”操纵,但在某种意义上例如,一个[C1 + C2 + ... + Cn]组合可以为每个C1,C2,... Cn调用C.foo(),然后然后将这些逻辑添加到操作中结果类似地,用对象集合来构成语法术语,例如:[C1“”“(”C1“+”C2“*”“(”C2“ +“C2”)“”)“]将调用C1.foo(),C2.foo(),然后根据正常的数学评估结合这些结果。最初,我只是想处理像* +()这样的基本数学运算,但是希望能够在以后对自定义(非数学)术语进行扩展。解析类实例的方法与自定义的语法在Python

的类功能的基本代表性草图如下(这主要是概念性的;特别是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()== “丢失”,再返回-100 * C.my_val(VAL),否则只返回厘米

语法表示C1 + C2和C1.location =“lost”,C2.location =“antarctica”,则CMIX.my_val(20)将评估为:-100 * C1.my_val(20)+ C2.my_val (20)

有没有一种现有的简单方法在Python中做到这一点?或者可能是一个允许创建这种评估规则的轻量级库。例如,我发现了https://github.com/pydata/numexpr,但是这直接适用于数据类型,而它应该应用到对象层上,应用自定义逻辑,然后执行标准数学语法操作顺序。

任何方向试图做到这一点非常感谢! 关于

+1

虽然也许你正在寻找的是运算符重载,但你并不清楚你在问什么。 – pvg

+0

这个“语法”来自哪里,为什么你称之为语法?它似乎与解析或语法没有多大关系。这听起来像你可以让“语法”成为一种功能。 – user2357112

+0

@ user2357112从某种意义上说,一个语法具有一组定义的操作,每个操作对同一个项目类型执行相同的任务。这不是一种语法 - 一套确定某些事物彼此之间如何构成的规则。在这种情况下,事物是一个类,结构化规则集是另一层(一致)逻辑之上的数学运算。函数仅仅是语法的一部分。数学评估有其自己的语法。我想知道是否有现有的解决方案,所以我不重新发明轮子。也许https://fdik.org/pyPEG/ – undercurrent

Pyparsing使定义中缀表示法解析器变得非常容易,并且可以在类中包装运算符和操作数以执行标准或自定义行为。看到这个问题及其基于pyparsing的解决方案:pyparsing nestedExpr and nested parentheses