六行代码实现 Python 管道

2021-01-10 17:14:24 +08:00
 abersheeran

不多说,直接上代码。

from functools import partial

class F(partial):
    def __ror__(self, other):
        if isinstance(other, tuple):
            return self(*other)
        return self(other)

使用样例。

range(10) | F(filter, lambda x: x % 2) | F(sum)

更详细的前因后果介绍,可以看 https://aber.sh/articles/Python-Pipe/ ,实在是懒得复制到 V2EX 调样式了。有兴趣的就看看,没兴趣的就复制代码去用就完事。

小小的得瑟一下,这是最近几天写的最满意、最有用的代码。妙手偶得之~

13720 次点击
所在节点    Python
122 条回复
abersheeran
2021-01-26 23:20:35 +08:00
@css3 是的。还有更多用法讨论在 GitHub discussion 里。可以看看。
vance123
2021-02-19 02:25:18 +08:00
@abersheeran 虽然已经是很久以前的帖子了, 不过还是挖一下坟吧.

这样的用法我过去在 Mathematica 里见过, 有语法层面的支持, 被称作 postfix operator, 即用 x ~ f 来表示 f(x).
在看到楼主帖子后我又搜索了一下, 发现更确切的叫法是 forward pipe operator, 在函数式语言中比较常见, 例如 F#中的`|>`.
有人试图在 C#里引入该特性( https://github.com/dotnet/roslyn/issues/5445), 虽然没通过, 但双方对利弊展开了精彩的讨论.
希望能对楼主和其他人有所帮助

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/743574

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX