起因是两个痛点:
with open('text.txt', 'w', encoding='utf-8') as f:
f.write("Hello World!")
with open('text.txt', 'r', encoding='utf-8') as f:
text = f.read()
由于编码基本上除了 utf-8 很少用别的,所以直接两句话写成函数,变成:
from pipeit import Read, Write
Write("text.txt", "Hello World!")
text = Read("text.txt")
好处除了少写几个字外,拆成 Read 和 Write 更不容易调错模式。 当然,这是幼儿园时候做的工作了,不值一提。
但是事已至此还有一个痛点,就是在这种模式下需要使用序列化的话(这也是常用操作),逻辑顺序就不太对
from pipeit import Read, Write
import json
l = list(range(10))
Write("l.json", json.dumps(l)) # 符合向 A 文件写入 B 的逻辑顺序
ll = json.loads(Read("l.json")) # 书写顺序上,不是先“读”再“解”,感觉写起来很别扭
py 做链式逻辑和函数式运算经常出现这种不太舒服的问题,不舒服这么长时间也一直忍着了。不过今天临睡前突然脑洞,既然函数式运算可以将习惯改成l = range(10) | Filter(lambda x:x^2) | Map(str) | list
这种形式,读写能不能也进一步魔改一下,变成如下效果:
json.dumps(list(range(10))) | Write("l.json")
l = Read("l.json") | json.loads
想了想,类似管道的写法用魔术方法重载可以很容易地实现,但是需要同时让 Read/Write 函数能向管道传递东西,又能直接读文件到字符串,这就需要再多费些力气了。于是又推迟睡眠时间 1 小时,罪过罪过,明天一定早睡。。。
最后成品效果大概是这样:
思路大概是用内建的 inspect 和 ast 模块实现抽象和反射,让Read()
既是类也是函数,需要是类就是类,需要是函数就是函数。。。困了,代码还没整理上传到 pypi ,有时间再搞吧。
没什么意义,有点回字的四种写法。但是一个语言能灵活至此,我玩得很开心就是。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.