V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
Trim21

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

  •  
  •   Trim21 ·
    Trim21 · May 19, 2019 · 3238 views
    This topic created in 2538 days ago, the information mentioned may be changed or developed.

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

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


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

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

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

    因为我主要目的是用在另一个项目里,所以现在都是粗放的人肉测试的…
    wzw
        8
    wzw  
       May 20, 2019 via iPhone
    也坑过,好东西
    thechosenone
        9
    thechosenone  
       May 21, 2019
    @Trim21 我说的是 declarative_base,确实也符合你说的这种情况
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   812 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 21:06 · PVG 05:06 · LAX 14:06 · JFK 17:06
    ♥ Do have faith in what you're doing.