如何在Python中强制执行闭合括号的代码规范检查

7
我们正在一个项目中使用flake8和pylint进行代码风格检查。但问题在于,它们都不会检查行分割方式的一致性。由于在一个项目中保持一致性是很好的,所以我们发现以下这样的情况看起来非常奇怪:
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

foo = long_function_name(
    var_one,
    var_two,
    var_three,
    var_four)

foo = long_function_name(
    var_one,
    var_two,
    var_three,
    var_four
)

foo = {
    a,
    b}

foo = {
    a,
    b,
}

在我们的代码库中,有时候不同的关闭方式会紧邻在一起,就像上面的例子一样。
现在是否有一个pylint、flake或特殊检查器的检查器或规则,只需确保:
如果您有一个悬挂缩进,那么关闭括号、花括号或括号始终在新行中,并且我们在它们之上有一个尾随逗号。
在干净的代码库中,一致性非常重要,如果没有自动检查,则不能依赖开发人员遵守规则。因此,我需要一个检查器来处理上述情况。

请至少对您的帖子标题进行拼写检查。此外,请阅读发布指南。没有必要为任何事情“感谢”任何人。在问题中,“谢谢。”只是噪音。如果您的问题实际上得到了回答,那么您可以通过投票和/或接受答案来感谢他们。 - user9315861
你听说过 black 吗?你可以将其设置为 pre-commit hook,这样所有的代码都会被格式化成相同的风格。 - Bryan Oakley
4个回答

1
你可以使用 wemake-python-styleguide。它是一组包含大量新规则的 flake8 插件。
运行以下命令以安装它: pip install wemake-python-styleguide 执行命令:flake8 your_module.py 但注意,这只是一个 flake8 插件!
你感兴趣的具体规则是 consistency.ParametersIndentationViolation
正确的代码示例:
# Correct:
def my_function(arg1, arg2, arg3) -> None:
    return None

print(1, 2, 3, 4, 5, 6)

def my_function(
    arg1, arg2, arg3,
) -> None:
    return None

print(
    1, 2, 3, 4, 5, 6,
)

def my_function(
    arg1,
    arg2,
    arg3,
) -> None:
    return None

print(
    first_variable,
    2,
    third_value,
    4,
    5,
    last_item,
)

# Special case:

print('some text', 'description', [
    first_variable,
    second_variable,
    third_variable,
    last_item,
], end='')

错误的代码示例:

call(1,
     2,
     3)

print(
    1, 2,
    3,
)

文档:https://wemake-python-stylegui.de


0

PEP8没有强制执行的一些检查因此默认情况下被pycodestyleflake8包装的其中一个linter)忽略,但是如果选择可以实际上进行这些检查。在这里你可以检查错误代码并更改默认行为以选择要运行的代码。

flake8 --select E123

如果您已经编写了这些样式的代码,但是之前没有进行过检查,您可以使用autopep8格式化工具对其进行重新格式化:

autopep8 --select=E123 --in-place --recursive .

-1

我也在使用flake8,但无法配置它来强制执行一致性,因为你的所有示例都符合PEP8标准。

为了强制执行一致性,我找到了https://github.com/python/black:“不妥协的代码格式化程序”。除了重新格式化代码外,它还可以使用--check标志作为linter(请参见下面的示例用法)。

当我在你的示例上调用black时,前三个示例的格式如下:

foo = long_function_name(var_one, var_two, var_three, var_four)

而最后两个被格式化为:

foo = {a, b}

为了演示:1)当需要换行时黑色的工作原理;2)使用黑色作为linter的方法:
$ cat bar.py
foo = long_function_name(
    var_one,
    var_two,
    var_three,
    var_four,
    var_five,
    var_six,
    var_seven)

foo = long_function_name(
    var_one,
    var_two,
    var_three,
    var_four,
    var_five,
    var_six,
    var_seven,
    var_eight,
    var_nine
)

$ black --check bar.py
would reformat bar.py
All done!   
1 file would be reformatted.

$ black bar.py
reformatted bar.py
All done! ✨  ✨
1 file reformatted.

$ cat bar.py
foo = long_function_name(
    var_one, var_two, var_three, var_four, var_five, var_six, var_seven
)

foo = long_function_name(
    var_one,
    var_two,
    var_three,
    var_four,
    var_five,
    var_six,
    var_seven,
    var_eight,
    var_nine,
)

$ black --check bar.py
All done! ✨  ✨
1 file would be left unchanged.

-1

我已经怀疑了,但那不是我想问的。问题是:有没有办法检查这个? - zidarsk8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接