python中缀前进管道

python中缀前进管道,第1张

概述我正在尝试实现一个前向管道功能,比如bash的|或R的近期%>%.我已经看到了这个实现 http://dev-tricks.net/pipe-infix-syntax-for-python,但是这要求我们事先定义可能与管道一起工作的所有函数.在寻找完全一般的东西时,这是我到目前为止所想到的. 此函数将其第一个参数应用于其第二个参数(函数) def function_application(a,b) 我正在尝试实现一个前向管道功能,比如bash的|或R的近期%>%.我已经看到了这个实现 http://dev-tricks.net/pipe-infix-syntax-for-python,但是这要求我们事先定义可能与管道一起工作的所有函数.在寻找完全一般的东西时,这是我到目前为止所想到的.

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

def function_application(a,b):    return b(a)

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

def sq(s):    return s**2

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

从this开始,我们可以定义一个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)

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

p = Infix(function_application)

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

5 |p| sq25

要么

[1,2,3,8] |p| sum |p| sq196

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

解决方法 快速回答:

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

答案很长:

每一行都是一个声明(simple或compound),一个stmt可以是几个东西,其中一个是expression,一个表达式是唯一允许使用or operator的结构.和greater than comparison> (或者所有运算符和比较<>< => = | ^&>><< - %/ //),每个表达式都需要左手边和右手边,最终形式为lhs op rhs,左右两侧都可以是另一种表达方式,但退出的情况是使用primary(除了unnary –,〜而且只需要一个rhs),主要的将归结为标识符,数字或字符串,因此,在一天结束时,您需要在a |旁边有一个identifier [a-zA-Z _] [a-zA-Z_0-9] *.

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

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

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

总结

以上是内存溢出为你收集整理的python中缀前进管道全部内容,希望文章能够帮你解决python中缀前进管道所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1193331.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存