V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AndyAO
V2EX  ›  问与答

Python 内置模块的 split 函数发生了令人疑惑的变化,这是 BUG 吗?

  •  1
     
  •   AndyAO · 2021-04-23 07:53:54 +08:00 · 1320 次点击
    这是一个创建于 1311 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从 Python 3.6.8 升级到 Python 3.9.0,执行单元测试后,发现 re.split() 的行为发生了显着的变化,但是查看相关的文档(Changelogre)却没有发现有什么变化。

    这种变化可以用单元测试,较为精确的表示 :

    number = '123'
    def test_Asterisk_quantifier_with_capture_group(self):
        resultList = re.split(r'(\d*)', self.number)
        if platform.python_version() == '3.6.8':
            self.assertEqual(resultList,['', '123', ''])
            
        else:
            self.assertEqual(resultList,['', '123', '', '', ''])
    

    感觉这明显不符合 split 文档中对功能的描述,还有个奇怪的现象是将*换做+后,行为仍与 3.6.8 相同。

    1. 为什么这种变化没有在文档中出现?是我没有找到它吗?
    2. 为什么行为发生了这样的变化?是引入了 BUG,还是了修复 BUG ?
    4 条回复    2021-04-23 10:14:01 +08:00
    robinjin
        1
    robinjin  
       2021-04-23 08:38:22 +08:00   ❤️ 1
    你在 Python 3.6.8 的交互模式下执行 re.split(r'(\d*)', ‘123’) ,有提示的。
    jsdtxm
        2
    jsdtxm  
       2021-04-23 08:40:47 +08:00   ❤️ 1
    在 3.7.9 中结果为['', '123', '', '', '']。
    查阅文档( https://docs.python.org/zh-cn/3.8/whatsnew/3.7.html )发现有这么一行:
    “re.split() 现在支持基于匹配一个空字符串的模式例如 r'\b', '^$' 或 (?=-) 进行拆分。 (由 Serhiy Storchaka 在 bpo-25054 中贡献。)”
    您看看是这个吗?
    AndyAO
        3
    AndyAO  
    OP
       2021-04-23 08:54:31 +08:00
    @robinjin #1
    在交互模式下运行,的确看到了
    FutureWarning: split() requires a non-empty pattern match.
    以后遇到问题看来可以在交互模式下运行,也许会有相关的提醒

    @jsdtxm #2
    Split 的模式为非空的确更合理,我也认为你发的那个文档上的更改信息是正确的,看来我查错地方了,changelog 上是没有这个说明的。

    虽然还是没看懂这个更改的意义,但知道了可能为空的模式有问题,以后就不会这么用了。

    谢谢
    AndyAO
        4
    AndyAO  
    OP
       2021-04-23 10:14:01 +08:00
    在非交换模式下运行也是有提醒的,只不过颜色不太明显,在 IDEA 上会默认着色,这个比 VSCode 强。

    https://cdn.jsdelivr.net/gh/Andy-AO/GitHubPictureBed/img/20210423101302.png
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   871 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:56 · PVG 04:56 · LAX 12:56 · JFK 15:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.