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

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

  •  
  •   Trim21 · 211 天前 · 1645 次点击
    这是一个创建于 211 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条附言  ·  209 天前
    点收藏的诸位能不能也顺便给个 star …
    9 回复  |  直到 2019-05-21 08:24:28 +08:00
        1
    omph   211 天前
    确实是坑
    ("abc")和("abc",)
    遍历一下试试
        2
    thechosenone   211 天前
    写 python 加逗号那你要解决的不仅仅是检查 tuple 了
        3
    Trim21   211 天前
    @omph #1 这两个是不会报错的,前一个不是 tuple,后一个有括号
    你说我还以为出 bug 了。。。


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

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

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

    因为我主要目的是用在另一个项目里,所以现在都是粗放的人肉测试的…
        8
    wzw   210 天前 via iPhone
    也坑过,好东西
        9
    thechosenone   209 天前
    @Trim21 我说的是 declarative_base,确实也符合你说的这种情况
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4100 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 05:40 · PVG 13:40 · LAX 21:40 · JFK 00:40
    ♥ Do have faith in what you're doing.