被 Python 的无括号创建 tuple 的语法坑了好几次,写了个工具自动检查他

2019-05-19 12:06:13 +08:00
 Trim21

https://github.com/Trim21/find-trailing-comma

好几次不小心在句尾多敲了一个逗号,半天 debug 不出问题。

找了一圈又没有任何一个 lint 工具或者格式化工具能帮我。

迫于无奈自己写了一个

a = 1, # not ok
b = 1, # not ok
d = (1, ) # ok
c = {1, 2,
     3, 4}, # not ok

只有在下面两个条件都满足的情况下才会报错

  1. 这个 tuple 只有一个元素,无论这个元素的形式有多么复杂(感谢 ast,省下了很多功夫)
  2. 整个 tuple 没有用括号括起来

这是我唯一想到的可能会引起问题的写法

这是一个用在 pre-commit 中的钩子,如果你想要使用请参照文档 https://pre-commit.com/

在项目的.pre-commit-config.yaml添加如下配置,就可以生效了

  - repo: https://github.com/Trim21/find-trailing-comma
    rev: v0.0.1
    hooks:
      - id: find-trailing-comma

效果如下

Find trailing commas.....................................................Failed
hookid: find-trailing-comma

my_project/cli.py:533 has single element tuple with no brackets "a = 1,"

只支持 python3,python2 未经测试,说不定也能跑

2582 次点击
所在节点    分享创造
9 条回复
omph
2019-05-19 12:28:09 +08:00
确实是坑
("abc")和("abc",)
遍历一下试试
thechosenone
2019-05-19 12:33:24 +08:00
写 python 加逗号那你要解决的不仅仅是检查 tuple 了
Trim21
2019-05-19 12:44:42 +08:00
@omph #1 这两个是不会报错的,前一个不是 tuple,后一个有括号
你说我还以为出 bug 了。。。


@thechosenone #2 其他能加括号而不造成语法错误的情况不会造成什么严重后果,比如函数参数和字典内最后的括号,顶多影响一下格式化插件的行为。
thechosenone
2019-05-19 13:08:09 +08:00
@Trim21 你 sqlalchemy 定义表的时候每行加逗号试试
Trim21
2019-05-19 13:22:05 +08:00
@thechosenone #4 没能理解,我不太熟悉 sqlalchemy,举个例子?

不太清楚你说的是 Table 还是 declarative_base ?前者是函数调用或者类实例化,最后有没有逗号无所谓。
后者是定义类的属性,加逗号的话属性的类型就会从原本的值变成一个 tuple,这本来就是我写这个东西想要避免发生的情况。
guyskk0x0
2019-05-19 13:39:31 +08:00
好东西,曾经就被坑过。考虑 PR 到 flake8, pycodestyle 吗
Trim21
2019-05-19 13:56:17 +08:00
@guyskk0x0 考虑过,只是现在还没太有时间,感觉要向大开源项目提 PR 要做的事情太多了(他们还不一定能合并)。

但是现在这样写个 pre-commit 的钩子随意性就强很多了,我连 ci 和单元测试都没写😂

因为我主要目的是用在另一个项目里,所以现在都是粗放的人肉测试的…
wzw
2019-05-20 07:44:12 +08:00
也坑过,好东西
thechosenone
2019-05-21 08:24:28 +08:00
@Trim21 我说的是 declarative_base,确实也符合你说的这种情况

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

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

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

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

© 2021 V2EX