六行代码实现 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 调样式了。有兴趣的就看看,没兴趣的就复制代码去用就完事。

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

12345 次点击
所在节点    Python
122 条回复
msg7086
2021-01-10 17:24:29 +08:00
(虽然我知道这很煞风景,但是我真的忍不住想要吐槽一句,你这不就是把 Python 写成了 Ruby 吗……)
msg7086
2021-01-10 17:27:20 +08:00
顺带提一句,如果让我来写 Python 的话,我可能还是选择把代码写成 list comprehension (可能需要推倒两次)。
不写 map reduce 是因为怕被 Python 用户吐槽不够 Pythonic 。
abersheeran
2021-01-10 17:37:32 +08:00
@msg7086 四年 Python 老玩家了,谁敢说我不代码 Pythonic 我就怼死他,我写 C 都 Python 味儿了。😀

Ruby 是真没用过,我甚至没有用过任何一门纯粹的函数式编程语言。管道我还是从 Shell 学到的,虽然 Shell 我只是用到 | grep 这种地步。但并不妨碍我真诚的觉得管道很好用。在我几个函数式教徒朋友给我推销的函数式编程概念里,柯里化和管道是我认为唯二可在工业代码里大量使用的。
msg7086
2021-01-10 17:48:52 +08:00
我之前写任务依赖管理的时候也是把 pipe 拿来用了。
class Tasks < Array
def |(op)
op.call(sources: self)
end
end
类似这么个结构,感觉和你的差不多。
自己发明 DSL 确实很有成就感。
Leigg
2021-01-10 17:54:14 +08:00
有半年没有写 py 了,现在都进化到这个程度了吗?
Leigg
2021-01-10 17:55:14 +08:00
我擦,原来是 magic method 。还以为是 shell 语法呢。
stdout
2021-01-10 18:06:01 +08:00
很花哨实用。
python4
2021-01-10 18:06:18 +08:00
等 python4 发布的时候就作为 feature 吧。
SjwNo1
2021-01-10 18:20:54 +08:00
是很优雅,但不够语义化 - . -
whileFalse
2021-01-10 18:41:38 +08:00
不错 很优雅!
abersheeran
2021-01-10 19:08:27 +08:00
@python4 Guido:I don't like it.
ferock
2021-01-10 19:09:25 +08:00
学习
Jirajine
2021-01-10 19:22:37 +08:00
不错,可以发布到 pypi
abersheeran
2021-01-10 19:28:57 +08:00
@Jirajine 请不要把 npm 行为带到 Python 社区。满打满算六行代码,这也需要 PyPi 走一下?复制粘贴它不香吗。我要是真发布了,setup.py 比源码还大。
abersheeran
2021-01-10 19:31:43 +08:00
@SjwNo1 如果你认为运算符不够语义化,建议开新文,炮轰 Shell 的管道运算符不够语义化。会有人跟你对线。
如果你认为 F 这个命名不够语义化可以用 Pipe,Python3 里你甚至可以给它一个中文名,管道。够语义化吗?
Jirajine
2021-01-10 19:51:20 +08:00
@abersheeran 复制粘贴是可以,但每个模块都复制粘贴一遍也不合适,还是得自己建一个模块再倒入,这和直接从 pypi 导入也没多大区别吧?
再者一般情况都从 pypi 找包,即使让人直接从 readme 里复制粘贴。不上的话不利于曝光需要的人也很难找到。
YUX
2021-01-10 20:07:10 +08:00
`range(10) | F(filter, lambda x: x % 2) | F(sum)` 是奇数和叭
dorafmon
2021-01-10 20:54:25 +08:00
@Jirajine 用这个呗, 不是很接近了? https://pypi.org/project/pipetools/
abersheeran
2021-01-10 21:08:25 +08:00
@YUX 谢谢指正,写错了哈哈哈。好尴尬,待会就改。
aijam
2021-01-10 21:12:58 +08:00

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

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

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

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

© 2021 V2EX