gpt4 book ai didi

python中缀前向管道

转载 作者:太空狗 更新时间:2023-10-30 02:10:33 27 4
gpt4 key购买 nike

我正在尝试实现一个前向管道功能,例如 bash 的 | 或 R 的最近的 %>%。我看过这个实现 https://mdk.fr/blog/pipe-infix-syntax-for-python.html ,但这需要我们预先定义所有可能与管道一起使用的功能。在寻求完全通用的东西时,这是我到目前为止的想法。

这个函数将它的第一个参数应用到它的第二个(一个函数)

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| sq
25

[1,2,3,8] |p| sum |p| sq
196

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

最佳答案

快速回答:

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

长答案:

每一行都是一个语句(simplecompound),一个stmt可以是几件事,其中有一个 expression , 表达式是唯一允许使用 or operator 的构造|greater than comparison > (或与此相关的所有运算符和比较 < > <= >= | ^ & >> << - + % / // ),每个表达式都需要左侧和右侧,最终采用 lhs op rhs 形式, 左侧和右侧都可以是另一个表达式,但退出情况是使用 primary (除了一元 -~+ 只需要一个 rhs ),主要的将归结为标识符,数字或字符串,所以,在一天结束时你需要有一个identifier [a-zA-Z_][a-zA-Z_0-9]*沿着a | .

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

作为引用,这里是完整的语法:

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

关于python中缀前向管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29219590/

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