python中缀前进管道

kee*_*gan 4 python infix-notation

我正在尝试实现一个前向管道功能,比如bash |或R最近%>%.我已经看到了这个实现http://dev-tricks.net/pipe-in​​fix-syntax-for-python,但这要求我们事先定义可能与管道一起使用的所有函数.在寻找完全一般的东西时,这是我到目前为止所想到的.

此函数将其第一个参数应用于其第二个参数(函数)

def function_application(a,b):
    return b(a)
Run Code Online (Sandbox Code Playgroud)

例如,如果我们有一个平方函数

def sq(s):
    return s**2
Run Code Online (Sandbox Code Playgroud)

我们可以用这种繁琐的方式调用该函数function_application(5,sq).为了更接近前向管道,我们希望使用function_application中缀表示法.

由此绘制,我们可以定义一个Infix类,以便我们可以将函数包装在特殊字符中,例如|.

class Infix:
    def __init__(self, function):
        self.function = function
    def __ror__(self, other):
        return Infix(lambda x, self=self, other=other: self.function(other, x))
    def __or__(self, other):
        return self.function(other)
Run Code Online (Sandbox Code Playgroud)

现在我们可以定义我们的管道,它只是函数的中缀版本function_application,

p = Infix(function_application)
Run Code Online (Sandbox Code Playgroud)

所以我们可以做这样的事情

5 |p| sq
25
Run Code Online (Sandbox Code Playgroud)

要么

[1,2,3,8] |p| sum |p| sq
196
Run Code Online (Sandbox Code Playgroud)

在那个冗长的解释之后,我的问题是,是否有任何方法可以覆盖有效函数名称的限制.在这里,我已经命名了管道p,但是可以重载非字母数字字符吗?我可以命名一个功能,>所以我的管道是|>|

Aug*_*ack 6

快速回答:

你不能真正|>|在python中使用,至少你需要| * > * |在哪里*需要标识符,数字,字符串或其他表达式.

答案很长:

每一行都是一个陈述(简单复合),一个stmt可以是一些东西,其中一个是表达式,一个表达式是唯一允许使用或运算符 |大于比较的 构造>(或者所有运算符和比较)< > <= >= | ^ & >> << - + % / //),每个表达需要一个左手边和一个右手边,最终形式lhs op rhs,左右两边都可以是另一个表达,但退出的情况是使用一个主要(除了unnary -,~+只需a rhs),主要部分将归结为标识符,数字或字符串,因此,在一天结束时,您需要在a侧具有标识符 .[a-zA-Z_][a-zA-Z_0-9]*|

您是否考虑过一种不同的方法,例如一个类覆盖或运算符而不是中缀类?我有一个很小的图书馆管道,你可能会感兴趣

供参考,这是完整的语法:

https://docs.python.org/2/reference/grammar.html