duangsuse::Echo
460 subscribers
3.9K photos
107 videos
574 files
5.53K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行遍天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上事。知变守恒又穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可以退出
suse的小站(面向运气编程): https://wojs.org
Download Telegram
duangsuse::Echo
#py 周刊 - 周刊1 无语了, #telegram 上写文怎么破事那么多呢? Ctrl+K 弹框又限bot干🐴呢,哇会做C++ UX真是太厉害了,Markdown编辑都搞不全 //替换/^\d*、//g; $0.innerHTML.replace(/<.?p.*?>/g,"") $$('p').forEach(e=> e.replaceWith(...e.childNodes)) $('[tabindex]:read-write').innerHTML=prompt() 只能在vs和web两个浏览器间,直接CtrlCV文档…
#py 周刊
周刊1
#新品
Black 格式化工具+lint的替代者Ruff:快 30 倍以上 25w/.1s
你应该什么时候升级到 Python 3.12?建议你等到 12 月,修复不兼容的软件包、缺少二进制包

Python 3.12:一个被人忽略的史诗级版本 👍
改进 Numpy 的 Python API,为 2.0 版本准备

3.12 对于 Python 的意义,大于 3.5 的“async/await” 和 3.6 的 “Type Hint” 对于 Python 的意义!PEP-669 带来的可调试性(Cyberbrain call #visualize)、PEP-684 为 non-GIL 带来的性能提升、PEP-697 松耦合 C API


不要再用 requirements.txt 了, setup.py 的糟糕体验
推荐使用 Poetry。pip 的主要问题是没有 lockfile 和手工管理虚拟环境麻烦
在 Mac 上安装 Python 的正确方法作者给出的建议是 Pyenv + pyenv-virtualenv

uDjango:单文件的 Django 微型项目 这个项目是 DjangoCon US 2023 的演示项目,使用单文件不到 10 行代码,演示一个最小的 Django 应用。
Django vs Flask:哪个是最好的 Python Web 框架?一篇细致的长文,详细对比了它们在模板系统、URL 调度器、数据库支持、身份验证及授权、测试、软件架构、学习曲线等方面的差异。没有更好的,只有是否适合你的。

从零开始编写一个 Python 异步 ASGI Web 框架 这篇循序渐进的教程是很好的学习材料,让你了解 Web 框架设计、异步编程
kivy+pandas 开发简单的 Android 数据分析应用其作用是记录和显示你全天在屏幕上花费的时间

#框架
为什么 Django 后台管理系统那么“丑陋”?Django Admin UI 很多年没有变化,显得设计过时了。因为它不应该暴露给终端用户。

数据库生成的列 :Django & SQLiteGeneratedField 是正在开发的 Django 5.0 的新功能,实现C=A+B等自动SQL算式。这篇文章还介绍了一些 Django 5.0 中的新东西
Kenneth Reitz:迟来的道歉,以及 requests 3 的进展2019 年时 requests 3 的筹款闹出了不小的风波!文中列举了目前已经完成的一些事情(typehint,imports,async)

esmerald:高度可扩展、高性能的 Web 框架基于 Starlette 和 Pydantic ,支持同步和异步,提供 DAO、ORM、ODM、依赖注入、权限管理等功能。
grequests:异步的 HTTP 请求grequests 构建在 gevent 库之上,一个提升性能的建议。

#技巧 😨
100%的测试覆盖率是不够的:Python 中基于命题的测试 如何设置 @pytest.mark.parametrize
Hypothesis

Python 如何在日志中隐藏明文密码? 基于 logging 模块的两种实现方案:自定义 filter 和自定义 formatter
使用 AI 进行网页抓取实验(使用 GPT-4 解析 HTML)GPT4的能力到底如何呢?如抓取结构良好的网站、抓取 Google 自然搜索结果、抓取 Google SERP、以及抓取 Google MAPS 结果。

从混沌到凝聚:构建你自己的 Monorepo 文章介绍如何使用 GitHub Actions。monorepo 是将所有项目都放到一个代码仓管理,可能包含不同语言和框架。这意味着对它的依赖管理和 CI/CD 等都与普通代码仓不同。
RSS-GPT:使用 ChatGPT 为你的 RSS 订阅源生成摘要使用 GitHub workflow 新生成 RSS 订阅源且推送到 GitHub Pages。一键配置无需服务器。


#精通
Python 是一种编译型语言

我们通常习惯将 Python 称为一种解释型语言,因为它在运行时逐行。很多人还知道 .pyc 其实也有编译的过程。作者通过苏格拉底式对话和几轮实验,引导读者重新思考“解释”与“编译”:它们是错误的二分法、限制了编程的可能性
Python-Type-Challenges:通过在线挑战来学习 Python 类型提示

开发一个 Python 编译器和解释器这是一系列博文,目前已更新 6 篇,目标是探索和研究实现 Python 等编程语言所需的概念和算法,将会涉及:Lex-YaCC、树解释器。

你能用 Python 的 bisect 模块做到这些事两个函数,可以做很多事:二分搜索、前缀搜索、在列表中查找连续的相等值、查找字典中最接近的键、自定义对象的排序、按照字典 key 搜索。
使用 Ptpython 提高你的编码效率Ptpython 是一个功能丰富且对用户友好的 Python REPL,在脚本中嵌入。
de4py:Python 逆向工程工具包 (neta de4dot) 一款高级的 Python 反混淆器,面向恶意软件分析师和逆向工程师,它拥有精美的 UI 和一些高级功能。

#资源 🤗
public-apis:面向开发者的公共 API 列表 非常非常丰富的公共 API 清单,内容应有尽有。(star 2K)

XHS_Downloader: 小红书图文/视频 spider
FunASR:端到端语音识别工具包阿里。有语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。(star 1.2K)
使用 Python+ChatGPT 开发一个书籍摘要 AI Langchain 和 OpenAI embedding 开发一个书籍摘要工具。另外,作者使用 Streamlit 发布了一个在线体验网站
duangsuse::Echo
#py #code #recommend 说到有趣的py接口,有个 iself() def read_as_io(f): class T(io.TextIOBase): read=lambda o,size: f(o) return T -匿名对象 之前写贪吃蛇 snk.c 就用到链表 不想缓冲区溢出的话Vec还是好的。C里你要实现[] 需要懂链表/strcat, rust 里你写 Vec<i32> push 就好了 Rust的生命周期现在基本不需要考虑(尤其是对应用开发时), type infer…
#py 周刊阅读笔记
https://t.me/NewlearnerChannel/12060
https://t.me/NewlearnerChannel/12097

https://www.kdnuggets.com/why-you-should-not-overuse-list-comprehensions-in-python
#code
primes =lambda upper_limit: [x for x in range(2, upper_limit + 1) if  x > 1 and all(x % i != 0 for i in range(2, int(math.sqrt(x)) + 1))]
primes(50)

#拆分后

is_prime=lambda num: num > 1 and all(num % i != 0 for i in range(2, int(math.sqrt(num)) + 1))

primes = [x
for x in range(2, 50 + 1)
if is_prime(x)
]

后面
def flatten_matrix(matrix):
def find_prime_indices(matrix, flattened_matrix):
求和排序的我不想写,因为明显可以用 yield和np.vectorize

# Parse&flatten the JSON string with deep"inner_key" into a Python dictionary
这个也不想,因为用match和递归更常见吧,elif isinstance 是什么py2地狱绘图

https://bernsteinbear.com//blog/simple-python-repl/#:~:text=readline%20API
https://www.skywind.me/blog/archives/2761
如何利用RegExp/创建REPL

出自 https://docs.python.org/3.11/library/re.html
#js #code 当输入 "3 hello 1world" 时展开缩写,并且补齐出现过的词

Lexer=kv=>{
let re=Object.keys(kv).map(x=>`(${x})`).join('|'), mf=Object.values(kv),m,i,j=0
re=RegExp(re, 'gy')
return (s,ontok)=>{
for(m of re[Symbol.matchAll](s)) ontok(
mf[(j=m.findIndex((x,i)=>null!=x &&i!=0))-1](m[j]), (i=m.index), i+m[0].length
)
}
}

f=Lexer({
'\\d+':parseInt,
'[a-zA-Z]+':s=>s,
'\\s+'(){}
})

rep=(txt,on, n=null)=>f(txt,x=> (x==null)?on(' '):
(x.substr)? (on(x.repeat(n)),n=null) :
(n=x)
)

buildAry=(f,a=[])=>(f(x=>a.push(x)), a)

buildAry(rep.bind(0,"3hi 1end")).join('')

因为JS部分都这么长,还是懒得移植到PyExecJS了,总之分词器、括号配对啥的可以靠正则,提供补齐列表也不难

就用 <body ContentEditable>+CSS.hilights 示例吧?
https://jsbin.com/kamufijomu/edit?js,output 😅

参考^回复,这样就有分词和括号配对高亮了?

—续周刊
https://github.com/stickfigure/blog/wiki/How-to-(and-how-not-to)-design-REST-APIs
十多项 REST API 的最佳实践规则,解释了规则的含义及实现
作者嘲笑了几家公司被广泛使用的 API,将它们作为规则的反例。

[Django 5.0 发布了!](https://docs.djangoproject.com/en/5.0/releases/5.0)
新增`Field.db_default` 参数,可设置由数据库计算的日期等默认值;`GeneratedField` 可以创建由数据库计算的列,简化了表单字段相关元素的呈现
FastAPI 已经支持 python-dependency-injector 实现依赖注入的方法。

[kolo VSCode 插件:查看 Django 应用的执行过程](https://github.com/kolofordjango/kolo)
具有帧可视化、漂亮的火焰图、显示执行了 SQL 查询的代码行
[autometrics-py:函数级的指标监测工具](https://github.com/autometrics-dev/autometrics-py)
只加一个装饰器,可检测函数的请求率、错误率和延迟,开箱即用仪表板、自定义告警、运行开销小

https://dev.to/taipy/new-open-source-vs-old-open-source-33k7
10 组在 Python 社区很知名的库的替代库,这里最没争议的估计是 Ruff 替代 Pylint,
其它则还有:Taipy/Streamlit、Polars/Pandas、Dask/PySpark、PyTorch/TensorFlow ……

[Python 借助 Gopy 库实现调用 Go.whl 包](https://last9.io/blog/using-golang-package-in-python-using-gopy/)
https://preslav.me/2023/11/27/python-is-easy-golang-is-simple-simple-is-not-easy/#:~:text=also%20at%20the-,core%20of%20Django,-%2C%20which%20speaks%20to

[对比 Python 与 Rust 的编程习惯用法](https://programming-idioms.org/cheatsheet/Python/Rust) 有意思的网站,可比较不同编程语言在 300 多项习惯用法上的区别
就像 https://component-party.dev/
https://kobzol.github.io/rust/python/2023/05/20/writing-python-like-its-rust.html
从 Rust 中学到的一些编程习惯:使用类型提示、使用数据类代替元组或字典、使用代数数据类型、使用“newtype”、使用构造函数、使用互斥锁等

[Python 工具箱系列文章](https://www.cnblogs.com/shanxihualu/p/17391082.html)
这是一个系列文章,目前包含 31 篇文章,最近介绍的几个工具是数据库相关的:Neo4j(一个 NoSQL 图数据库,使用 Py2neo 操作)、PostgreSQL

[trogon:为 CLI 程序生成友好的GUI](https://github.com/Textualize/trogon)
[当在终端输入“ls”后会发生什么?](https://www.warp.dev/blog/what-happens-when-you-open-a-terminal-and-enter-ls)(英文)
有一道很类似的常见的面试题:“当在浏览器输入 google.com 后会发生什么?”
[solara:一个纯 python、React-风格的ipywidget框架](https://github.com/widgetti/solara)
[用tkinter、PySimpleGUI 和 Jupyter Notebook 播放 GIF?](https://www.blog.pythonlibrary.org/2023/12/05/viewing-an-animated-gif-with-python/)
https://toga.readthedocs.io/en/stable/tutorial/tutorial-0.html#:~:text=()%0A%0A%20%20%20%20button%20%3D-,toga.Button,-(%22Hello%20world
Toga是跨平台的pyGUI
kanban-python:终端中的看板应用程序,和Vue TUI 一样
duangsuse::Echo
#py 周刊阅读笔记 https://t.me/NewlearnerChannel/12060 https://t.me/NewlearnerChannel/12097 https://www.kdnuggets.com/why-you-should-not-overuse-list-comprehensions-in-python #code primes =lambda upper_limit: [x for x in range(2, upper_limit + 1) if x > 1 and…
#py 周刊
[DSAlgo:数据结构和算法的面试题集锦](https://github.com/SamirPaulb/DSAlgo)
大公司的面试题与计算机类学习笔记等资料。(star 1.7K)
[“SQLite 源码有 15 多万行,但测试代码和脚本竟有九千多万行”](https://www.bmpi.dev/dev/renaissance-sqlite)
[如何系统地自学Python?](https://www.zhihu.com/question/29138020)
知乎上的一个热门问题,已有 7.4 万人关注和 1200+ 回答。
[你用 Python 做过最酷的事情是什么?](https://www.reddit.com/r/Python/comments/17upt2f/whats_the_coolest_things_youve_done_with_python/)
Reddit 上的热门讨论帖,也有近 700 条评论,需要刷很久才能看完。。。
[Python 多线程编程的终极指南](https://programmingeeksclub.com/ultimate-python-multithreading-guide) (英文)
[鹅厂程序员的 9 个生存法则](https://segmentfault.com/a/1190000043833549)


https://lucumr.pocoo.org/2023/12/1/the-python-that-was/
https://yorickpeterse.com/articles/a-decade-of-developing-a-programming-language/
“所有反对动态语言、不让弱化类型签名的论点存在很久了!今天他们也没有任何新的发明,也没有任何进步的改变。 但我们集体说:管它呢。 发挥自己的优势吧
曾经有这样一个世界,系统固有的复杂性,大得绝对需要 IDE、代码生成和编译时工具。相比之下,我的世界里有 Vim 以及一个基本的 Linux 盒子
我们,不应该再那么信任开发人员,并重新引入与软件语意对抗的复杂性。现代 Python 对于JavaEE人来说是不可能理解的。
(按:点名批评langchain 太不Pythonic 。今天强类型还是有进步的,Go的类型推导和ts的渐强类型 比Java好多了)


https://tonybaloney.github.io/posts/sub-interpreter-web-workers.html
- (可爱封面图) 用子解释器运行 Python 并行程序,比multiprocessing(fork)快100倍

PEP: https://pyfound.blogspot.com/2023/05/the-python-language-summit-2023-pattern.html
模式匹配语法是 3.10 版本的重大特性,但是 Sullivan 认为它的能力相当有限,因此提出了模式匹配的后续发展方向
[允许在 for 循环的循环头中使用推导式语法](https://discuss.python.org/t/allow-comprehension-syntax-in-loop-header-of-for-loop/25864)(英文)
这个帖子提出了一个想法:让 Python 的 for 循环支持推导式语法“for i in x if i % 2 == 0:”。

[解密 CPython:当执行 a+b 时,int与float如何被区分?](https://codeconfessions.substack.com/p/cpython-dynamic-dispatch-internals)
[深入理解 Python 虚拟机:描述器实现原理与源码分析](https://github.com/Chang-LeHung/dive-into-cpython/blob/master/obsy/03decriptor.md)
动态分发(Dynamic Dispatch)指的是在程序运行时(而不是在编译时)确定调用哪个方法或函数的过程。

彩蛋:
import this,antigravity
import keyword,strings
>>> keyword.softkwlist #'match' in it

[Python修饰器的函数式编程](http://coolshell.cn/articles/11265.html):左耳朵耗子唯一以 Python 为话题的文章,而且写得详细到位。
[Python 装饰器:用包装巫术增强你的代码](https://hackthedeveloper.com/python-decorator/)
[Python 元类教程(带示例)](https://coderslegacy.com/python-metaclass-tutorial/)(英文)
duangsuse::Echo
[人工智能 AI 孙燕姿模型应用实践](https://v3u.cn/a_id_310) 最近 AI 孙燕姿太火了!文章基于 Python3.10 和开源库 so-vits-svc(高表现力的语音合成模型)、Spleeter(人声和伴奏分离) [clone-voice: 一个带 web 界面的声线转换工具](https://github.com/jianchang512/clone-voice) 支持中文、英文、日语、韩语 4 种语言,也支持文字转语音(star 1.3K) [八十行代码实现开源的 Midjourney、Stable…
#py 周刊

https://coderslegacy.com/python-init-py-best-practices/
from a import * 
# 代表了 a.py
import a.b as b
# 代表 a/b.py
# 但是,你可以利用b.py imports 和 __all__=[] 对导出进行平铺化

https://nedbatchelder.com/blog/202312/realworld_matchcase.html
PEP: 在PyVM实现Null可空链 ?? ?. ?[]
这个修改非常复杂,但因为py不支持内联lambda ?.run{} ?: 什么的,恐怕没啥意义
btw. []"" 0 None or 已被用于null替换

https://augierpi.gricad-pages.univ-grenoble-alpes.fr/mojo-the-point-of-view-of-a-researcher-using-python.html#tiobe
mojo: 正在进步的py科学计算超集

msgspec: 支持BSON,toml,yml ; 比 pydantic 快10x
import msgspec
msgspec.json.encode(User("alice", groups={"admin", "engineering"}))

class User(msgspec.Struct):
"""A new type describing a User"""
name: str
groups: set[str] = set()
email: str | None = None


pydantic/FastUI : ASP# table再现

#ai #tool https://github.com/Coframe/coffee?tab=readme-ov-file#related
v0.dev , 外包围 <Coffee> 标签Ctrl+S就能让AI修改试运行, 完成后 < pour="" > 即合并代码
#py #tool 浏览器缓存 图片 爬虫
python a.py 'x\.com' 200 ~/.cache/chromium/Default/Cache/Cache_Data/*
python imgdump.py 'www' 100 `ls  --sort time --reverse ~/.cache/chromium/Default/Cache/Cache_Data/*`


#code
import re,struct, os

def ls_cache(urlRegex, kbSizeMin, *cache_files):
key_marker = struct.pack('Q', 0xf4fa6f45970d41d8)
def deco(b):
# header is 8+4+4:keylen+4+ bytes[keylen]
key_len = struct.unpack('I', b[12:16])[0]+4
key = b[20:20+key_len].decode()
body = b[20+key_len:b.find(key_marker)]
if len(body)>kbSizeMin*1024 and re.search(urlRegex,key):
return mstrip(100,re.sub('[\x00/]','', key)),body
mapFiles(cache_files,deco)

mstrip=lambda n,s: s if len(s)<n else f"{s[:n//2-2 -2]}..{s[n//2:]}"
def mapFiles(a, fOut):
os.system('rm -rf png;mkdir png')
for i,file in enumerate(a):
with open(file, 'rb') as f:
if f1:=fOut(f.read()):
k,v=f1
with open(f'png/{i}-{k}', 'wb+') as out_f:out_f.write(v)

if __name__ == '__main__':
import fire
fire.Fire(ls_cache)


你可以逐文件夹拼图: #bash 各种相对路径真的吐了
vcat() { cd $1;a=`find *|sort -n|xargs printf "-i %s\n"`
ffmpeg $a -filter_complex vstack=inputs=`wc -l <<<$a` ../$1.png ;cd -;}
for f in `ls`;do vcat $f;done

for f in find * -type d; do thunar -B $f/*; done #按文件夹 批量重命名
cp-id() { i=1; for x in "$@"; do X=$(basename "$x"); cp "$x" "${i}-${X%.*}.${X##*.}"; i=$((i+1)); done; }

最开始考虑了 https://t.me/dsuses/5305 和binwalk但太慢

mkdir a tar
cp `grep 'x.com' -FRl ~/.cache/chromium/Default/Cache/|find -size +200k` tar
binwalk -C a -D image:png tar/*
find a/ -name '*.png'|nl
#plt #code 谈到RPN,我昨天有个灵感想把js做成缩进的形式
就回顾了优先级算法(嵌套深度包括h1~h6树本质上也是优先级)

示例算法 sexp(tok('1 (2 3) 4')), exp(tok('1*2+3'), optab)

optab={[';']:-1}
"=;+ -;* /".split(';').map((a,l)=>a.split(' ').forEach(x=> optab[x]=l ))
exp=(s/*token x单项o算符 x..*/, l/*evels 大则深,紧 */)=>{
let o,x=()=>add(Number(s())), ord=[],add=x=>ord.push(x),
at=O=>{let A,B; x()
for(o=s();(A=l[o])>=(B=l[O]);)if(A!=B)at(o);else{add(O);x(); O=o;o=s()} add(O)
}
at(";");return ord
}

sexp=s=>{let a=[],x;for(;(x=s())&&x!=')';)a.push(x=='('?sexp(s):x); return a}
//^ 一般需配对。此省行数
sexp=(s, a=[], f=()=>{let x,i=0;for(;(x=s())&&x!=')';i++) {x=='('?f():a.push(x)} a.push(i) })=>(f(),a)
//'(a (b c) d)' 换RPN [a b c 2 d 3], 可显示步骤

tok=(cod, s=cod.split(/\s+|([()]|\W+)/).filter(x=>!!x).values())=>
()=>s.next().value



https://t.me/dsuse/19097 圆括号解析, CSS代码高亮
https://t.me/dsuse/19320 各种正则替代lex,trie 的妙用
https://t.me/dsuse/17410 带步骤 四则计算器

https://t.me/dsuse/19387 类型推导科普, 动态和词法域,SQL的方言, 转译器 sourcemap
https://t.me/dsuse/18139 bing挑战各种算法和BNF

我还想了个有意思的鬼畜kt翻译,只用 忆一事悟疑实 6个字:

忆一 忆 Pair(一 x:数, 一 y:数)

忆 Main(一 a:行<Pair>): Events {
悟 事 onInit() {
一实((x,y) 于 a) 疑{ x==Z -> 不输别玩 }
}
说的 废物 一 Z=0 //inline private
}
忆悟 Events {
道理 事 onInit()
}

可惜kt没支持 for(..a) 和 a.forEach{} 平权
不然还能更好玩
📝 明天写出来会贴gist
#py #signal https://t.me/dsuse/17587

def exponential_smoothing(result,data, alpha):
result[:] = [data[0]] # 初始值即为第一个数据点
for t in range(1, len(data)):
result.append(alpha * data[t] + (1 - alpha) * result[t - 1])

def moving_average(data, window_size):
for i in range(len(data) - window_size + 1):
window = data[i:i + window_size]
yield sum(window) / window_size


计步的实现核心就是状态机,我当年一顿花式踩钉耙,因为自己是脑科学背景的,很直觉的就想到了各种滤波器,时频变换方法,结果 JS 的信号处理生态一坨屎,碰得满脸血。

结果 GPT 告诉我你只需要一个非常简单、几行就能做出来的滤波器,以及一个状态机就能把事情做完了。

这时的我:蛤……????

可以参照源码:
https://github.com/Losses/aliceRun/blob/master/src/utils/StepCounter.ts

感谢现代技术给我重新做人的机会(鞠躬)
duangsuse::Echo
— CLI程序服务 getopts; complete 用于获取短参数和提供补齐。少数人用while shift/read;case 来解析 还有一个select in ; do,和py2 print 是异曲同工之败笔,请 ->展示zenity的所有功能,并生成一个简短的MC风格的文字冒险 #!/bin/bash while getopts ":n:s:err" opt; do #?未知 :空 case $opt in n) n=$OPTARG ;; s) s=$OPTARG ;;…
#py #code snake 贪吃蛇,最近很忙放着待改
import termios as TTY,copy, sys,time, numpy as np

from contextlib import contextmanager
from dataclasses import dataclass as d
@d
class tty:
fd:int
@property
def Is(_):return TTY.tcgetattr(_.fd)
@Is.setter
def Is(_,v):TTY.tcsetattr(_.fd, TTY.TCSADRAIN, v)

@contextmanager
def swap(x,r, f):
v=r.fget(x)
try: r.fset(x,f(v1:=copy.deepcopy(v))or v1);yield
finally: r.fset(x,v)

sdf=lambda w,h,f:np.fromfunction(lambda x,y:f(x-.5*w,y-.5*h), (w,h))
sdQuad=lambda r:lambda x,y:abs(x+y)+abs(x-y)-r
def snake(a=sdf(15,15, sdQuad(10)), fps=2):
a=np.vectorize(lambda P: 1 if P>2 else 0)(a)
n,m=a.shape; P=0;dP=1
kbd={'a':-1,'d':+1,'w':-m,'s':+m,}
def ADWS(a):a[3]=a[3] &~ TTY.ICANON|TTY.ECHO; a[-1][TTY.VMIN]=0
def f5():
nonlocal P
P+=dP;a[P//m,P%m]=0
print(a)
with swap(tty(0), tty.Is,ADWS):
while True:
k=sys.stdin.read(1); dP=kbd.get(k)or dP
print(f'\x1b[{n}A',end=''); f5(); time.sleep(1/fps)

snake()
#py #js #bin
不过你的下一个项目可以用 fitUint(nBit, obj,key){if o[k]undef or isF5:read else write} 这样的读取模式

能read,能解码,但是不能编码,听起来有点奇怪。 printf/scanf 都不是这样的

你明明知道一个struct的结构,能够免费实现load(),却无法修改保存你读到的东西,这不奇怪吗?

好吧,对工程界这是基本操作。Reader/Writer嘛
因为一般,人们只是把bin搞成JSON,而不会反过来,二进制都是旧程序员输出的东西了

struct datefld {unsigned short day : 5, month : 4, year : 14; };
https://en.cppreference.com/w/cpp/language/bit_field

那有没有可能按buffer读,但是对unaligned read,换bitfield(64)?
这样手写let x=readU8() ret{x} 的样板代码也会减少

py就有一个 cStruct
format = Struct(
"signature" / Const(b"BMP"),
"width" / Int8ub,
"height" / Int8ub,
"pixels" / Array(this.width * this.height, Byte),
)
https://construct.readthedocs.io/en/latest/intro.html#example

d = Bitwise(Struct(
Padding(2),
"x" / Flag,
Padding(5),
))
d.build(dict(x=5))
b' '
https://construct.readthedocs.io/en/latest/bitwise.html#bitstruct

ffmpeg那样开源又sota的系统工具太少了

我觉得jspy这些的API没做错,py这封装不是很完备么?只是习惯于类比文本和二进制的dev太少了,都是被迫在写

Hz写过ASN.1吗听说很快 还支持惰性XML

这玩意的stdint好像还是msdos的命名风格,真的直接按byte数定义binfmt不好么

其实穷人用 https://apps.kde.org/zh-cn/okteta/ 也行
还是Qt那帮人聪明,堪比ms