奇技淫巧

37次阅读

共计 1019 个字符,预计需要花费 3 分钟才能阅读完成。

起因是两个痛点:

  • IO 常用方法,比如读取和写入文件,每次都要写一长串,好烦
  • 调试代码时候偶尔会出现忘记把 ’w’ 模式改成 ’r’ 模式,导致数据被意外清空的情况
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,有时间再搞吧。

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

正文完
 0