奇技淫巧

2024-02-16 03:06:39 +08:00
LeeReamond  LeeReamond

起因是两个痛点:

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 ,有时间再搞吧。

没什么意义,有点回字的四种写法。但是一个语言能灵活至此,我玩得很开心就是。

3842 次点击
所在节点   Python  Python
10 条回复
nagisaushio
nagisaushio
2024-02-16 09:43:28 +08:00
iorilu
iorilu
2024-02-16 10:17:27 +08:00
读写文件可用 Path

有 read_text , write_text 方法
NoOneNoBody
NoOneNoBody
2024-02-16 12:12:34 +08:00
写了一堆闭包,就是为了防止这种错误,以及懒得记参数
txtRead, txtWrite, txtAppend
bytesRead, bytesWrite, bytesAppend
jsonLoads, jsonDumps, jsonRead, jsonWrite
pickleLoads, pickleDumps, pickleWrite
csvLoad, csvDumps, csvRead, csvWrite
...
yanyao233
2024-02-16 20:25:07 +08:00
我一般写项目先加这种工具类,记这些东西太麻烦了
LeeReamond
2024-02-16 23:33:25 +08:00
@nagisaushio v 站 py 区发库的很多都认识,他写他的我写我的

@iorilu Path 字多麻烦,最麻烦的是 write_text 还要打 utf-8 ,我实在是不想再打 utf 横岗 8 这几个键了。

@yanyao233 我现在基本就是工具类上 pypi ,换环境云端携带,习惯性先 from import *
iorilu
2024-02-16 23:40:53 +08:00
@LeeReamond 我不这么看

我现在牢记, 优选使用标准库, 不随便造轮子

代码, 可读性第一(这个可读性是指第一次看代码的人)
LeeReamond
2024-02-17 02:15:11 +08:00
@iorilu 如果感到快乐你就拍拍手
zhanglintc
355 天前
等下

json.dumps(list(range(10))) | Write("l.json")
l = Read("l.json") | json.loads

这里的 `|` 是什么,没见过 Python 里这个可以重载的啊?
LeeReamond
354 天前
@zhanglintc 然而它确实可以重载摊手
zhanglintc
354 天前
@LeeReamond #9 重载的是 `__or__` 呗?

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

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

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

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

© 2021 V2EX