起因是两个痛点:
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 ,有时间再搞吧。
没什么意义,有点回字的四种写法。但是一个语言能灵活至此,我玩得很开心就是。
1
nagisaushio 311 天前 via Android
|
2
iorilu 311 天前 2
读写文件可用 Path
有 read_text , write_text 方法 |
3
NoOneNoBody 311 天前
写了一堆闭包,就是为了防止这种错误,以及懒得记参数
txtRead, txtWrite, txtAppend bytesRead, bytesWrite, bytesAppend jsonLoads, jsonDumps, jsonRead, jsonWrite pickleLoads, pickleDumps, pickleWrite csvLoad, csvDumps, csvRead, csvWrite ... |
4
yanyao233 311 天前 via Android
我一般写项目先加这种工具类,记这些东西太麻烦了
|
5
LeeReamond OP @nagisaushio v 站 py 区发库的很多都认识,他写他的我写我的
@iorilu Path 字多麻烦,最麻烦的是 write_text 还要打 utf-8 ,我实在是不想再打 utf 横岗 8 这几个键了。 @yanyao233 我现在基本就是工具类上 pypi ,换环境云端携带,习惯性先 from import * |
6
iorilu 311 天前 2
|
7
LeeReamond OP @iorilu 如果感到快乐你就拍拍手
|
8
zhanglintc 283 天前
等下
json.dumps(list(range(10))) | Write("l.json") l = Read("l.json") | json.loads 这里的 `|` 是什么,没见过 Python 里这个可以重载的啊? |
9
LeeReamond OP @zhanglintc 然而它确实可以重载摊手
|
10
zhanglintc 282 天前
@LeeReamond #9 重载的是 `__or__` 呗?
|