V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Trim21
V2EX  ›  分享创造

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

  •  
  •   Trim21 ·
    Trim21 · 2019-05-19 12:06:13 +08:00 · 2722 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 未经测试,说不定也能跑

    第 1 条附言  ·  2019-05-20 19:50:02 +08:00
    点收藏的诸位能不能也顺便给个 star …
    9 条回复    2019-05-21 08:24:28 +08:00
    omph
        1
    omph  
       2019-05-19 12:28:09 +08:00
    确实是坑
    ("abc")和("abc",)
    遍历一下试试
    thechosenone
        2
    thechosenone  
       2019-05-19 12:33:24 +08:00
    写 python 加逗号那你要解决的不仅仅是检查 tuple 了
    Trim21
        3
    Trim21  
    OP
       2019-05-19 12:44:42 +08:00
    @omph #1 这两个是不会报错的,前一个不是 tuple,后一个有括号
    你说我还以为出 bug 了。。。


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

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

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

    因为我主要目的是用在另一个项目里,所以现在都是粗放的人肉测试的…
    wzw
        8
    wzw  
       2019-05-20 07:44:12 +08:00 via iPhone
    也坑过,好东西
    thechosenone
        9
    thechosenone  
       2019-05-21 08:24:28 +08:00
    @Trim21 我说的是 declarative_base,确实也符合你说的这种情况
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3183 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:11 · PVG 21:11 · LAX 05:11 · JFK 08:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.