万万没想到, Python 的字符串裁切函数居然还能有 bug

2022-12-21 19:54:53 +08:00
 WordTian

吐个槽,大家猜猜 python3 执行这 2 句话都会出现什么?

print('test.py'.rstrip(".py"))
print('testy.py'.rstrip(".py"))

这 2 句呢

print('test6y'.rstrip("6y"))
print('testy6y'.rstrip("6y"))
8691 次点击
所在节点    Python
51 条回复
junkun
2022-12-22 18:37:17 +08:00
@snw import string;print(string.whitespace)
snw
2022-12-22 19:06:55 +08:00
@junkun
恭喜,你也被坑了🐶

string.whitespace 只包含 ascii 范围内的 whitespace ,但 strip()参数留空时默认的 whitespace 是 unicode 范围的。

比如说以下两个 print 结果是不同的:
import string
s="abc\xa0"
print(s.strip())
print(s.strip(string.whitespace))
Jirajine
2022-12-22 22:53:07 +08:00
@jobmailcn 楼上已经说了,当时 py 还没有 set 类型,所以这就是设计缺陷,缺陷来源于历史包袱。
cpp 更是一个历史包袱一大堆的缝合怪,没什么好说的。
WordTian
2022-12-23 00:45:43 +08:00
没想到大家的反响这么大,估计也是有不少人被类似问题坑过的。。。
我发这贴的原因也是排查 bug 排查了半天,发现了问题之后,对这个函数的误用很是愤愤,发个贴吐槽吐槽。
最后,提示下 removesuffix 是 python 3.9 引入的,有些生产环境的版本可能还不支持。老老实实用数组下标进行裁剪吧
iseki
2022-12-23 09:44:08 +08:00
不不不,看到这种没明确写出 suffix 的函数,就应该提醒自己,它可能不是 suffix ,去看文档。话说看下文档也不麻烦,ctrl q 一下而已。
junkun
2022-12-23 20:03:23 +08:00
@snw 确实,我弄错了,strip 用的是 str.isspace ,而不是 string.whitespace 。
snw
2022-12-24 01:01:10 +08:00
ldyisbest
2022-12-24 12:08:23 +08:00
hhhh
llsquaer
2022-12-24 13:31:47 +08:00
这个很坑..可能是 strip 最初设计问题导致的意外情况..原意应该是去除两端字符,结果搞成了去除两端字符的任意组合.

strip 是删除左右两边字符串的组合...只要是任意组合匹配上就都删除..

3.9 版才真正的加入了 removeprefix 删除前缀 , removesuffix 删除后缀 , 这个才是完全匹配上才删除
snw
2022-12-24 15:41:25 +08:00
@llsquaer
str.strip()一开始没有参数,用途只是去除两端的若干空白字符,实现方法是由外到内逐个判断是否为空白字符,这个设计很自然没问题。去除“任意组合”只是描述实际表现出的行为。

Python 2.3 添加了参数用于自定义字符:
https://docs.python.org/3/whatsnew/2.3.html
The strip(), lstrip(), and rstrip() string methods now have an optional argument for specifying the characters to strip.
acerphoenix
2023-01-11 09:29:17 +08:00
有一说一,只看主题,直观的意思跟 op 理解的一样。虽然不 bug,但坑是一定的。

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

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

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

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

© 2021 V2EX