3.6% 的受测试 Python 存储库存在缺少逗号错误

关于 Python 代码易受与代码中错误使用逗号相关的错误的研究结果已经发布。 问题是由于以下事实引起的:在枚举时,如果列表中的字符串没有用逗号分隔,Python 会自动连接列表中的字符串,如果值后面有逗号,也会将值视为元组。 在使用 Python 代码对 666 个 GitHub 存储库进行自动分析后,研究人员发现 5% 的研究项目可能存在逗号问题。

进一步的手动检查显示,只有 24 个存储库(3.6%)存在真正的错误,其余 1.4% 是误报(例如,可以在行之间故意省略逗号以连接多行文件路径、长哈希、HTML块或 SQL 表达式)。 值得注意的是,在 24 个存在实际错误的存储库中,有 Tensorflow、Google V8、Sentry、Pydata xarray、rapidpro、django-colorfield 和 django-helpdesk 等大型项目。 然而,逗号问题并不是 Python 所特有的,并且经常出现在 C/C++ 项目中(最近修复的示例包括 LLVM、Mono、Tensorflow)。

研究的主要错误类型:

  • 列表、元组和集合中意外丢失逗号,导致字符串被连接而不是被解释为单独的值。 例如,在 Sentry 中,其中一项测试遗漏了列表中字符串“releases”和“discover”之间的逗号,这导致检查不存在的“/releasesdiscover”处理程序,而不是检查“/releases”和“ /发现”单独。
    3.6% 的受测试 Python 存储库存在缺少逗号错误

    另一个例子是rapidpro中缺少逗号导致两个不同的规则在第572行合并:

    3.6% 的受测试 Python 存储库存在缺少逗号错误

  • 单元素元组定义末尾缺少逗号,导致分配分配常规类型而不是元组。 例如,表达式“values=(1,)”将导致对一个元素的元组的变量进行赋值,但“values=(1)”将导致对整数类型的赋值。 这些赋值中的括号不会影响类型定义并且是可选的,并且解析器仅根据逗号的存在来确定元组的存在。 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # 将被分配一个字符串而不是元组。) }
  • 相反的情况是赋值时多了逗号。 如果在赋值末尾意外留下逗号,则会将元组指定为值而不是通常的类型(例如,如果指定“value = 1,”而不是“value = 1”)。

来源: opennet.ru

添加评论