一些最近踩过的坑

虽然空闲时间不多,但是还是有在维护自己的个人项目。最近遇到的问题有点让人无语,就在这里记录一下吧。

Python 的 str.isdigit()

事情的起因是,有人试图在查歌的时候查「⑨」。

这似乎并没有什么问题,TA 的意图多半是查找「チルノのパーフェクトさんすう教室」。

而我的处理逻辑中,有一部分是:如果用户的输入是纯数字,就将其转换为数字并用 ID 查歌。

这似乎也没什么问题。

两件事正好碰在一起的时候,问题就来了:

1
2
3
if kw.isdigit() and int(kw) ...:

ValueError: invalid literal for int() with base 10: '⑨'

啊?

1
2
>>> '⑨'.isdigit()
True

啊??

连夜启动 Python 文档 - str.isdigit()

数字包括十进制字符和需要特殊处理的数字,如兼容性上标数字。这包括了不能用来组成 10 进制数的数字,如 Kharosthi 数。严格地讲,数字是指属性值为 Numeric_Type=Digit 或 Numeric_Type=Decimal 的字符。

这时候群友开始提议:\d+

然后另外一个群友掏出了这个:

1
2
3
>>> import re
>>> re.match(r'\d+', '٢٢7')
<re.Match object; span=(0, 3), match='٢٢7'>

……

我的解决方法:定义一个严格的 isdigit() 函数。

1
2
3
4
import string

def isdigit(s: str):
return all([c in string.digits for c in s])

让 pillow 识别到 libraqm

这事情的起因是,我发现渲染图片上的文字有一些 OpenType 的高级特性没有启用(主要是指 kerning)。而如果需要在 pillow 中使用这些特性,首先需要正确安装依赖库 libraqm

我不知道 pillow 的官方文档上面写的到底是真是假,总之我读完意思就是「依赖库我们都打在 wheel 里啦,你装好就能用!」

然而不管实际上是不是这个意思,还是说要用户自己安装 FriBiDi,总之 raqm 依赖都不是开箱即用的。

Linux aarch64 环境在我的测试下,没有手动安装 libraqm 之前是无法使用 / 检测到 raqm 支持的。Windows 更不用说,且 Linux wheel 里尚且还有 .so 文件,Windows 的 wheel 中根本没有库的 DLL。

但是 Linux 至少安装起来相对方便一点,仓库中有安装脚本,只需要准备好基本的 g++ 构建环境和 meson 就可以一键安装。在 Windows 平台手动编译这些东西,对于我这种没装 Visual Studio 也没装 MSYS2/MinGW 的,有点过于痛苦了。

好巧不巧,Unofficial Windows Binaries for Python Extension Packages 这个网页刚好前两天打不开了。但是我还是在 Wayback Machine 里找到了下载链接(还好静态资源没有一起失效)。不过放在 site-packages/PIL 里并不能让 pillow 识别到,只能新建了一个目录放进 PATH 了。

简单总结一下:

Linux:安装构建环境所需软件包,使用仓库中的 depends/install_raqm.sh 安装。

Windows:想办法找到 DLL 或者自行构建 libraqm & FriBiDi DLL,然后放置在 pillow 可以识别到的位置。


以上均为胡言乱语,如有事实错误,本人概不负责,请读者见谅。

作者

星野 みなと

发布于

2024-04-09

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×