首页 > 解决方案 > Python 代码风格:有没有办法配置 linter 将参数拆分为多行?

问题描述

目前,我正在使用 Django 3.1.4 开发 Python 3.8 项目,我希望以以下方式强制执行代码样式:

将可迭代对象拆分为多行,将括号与其内容保持在不同的行中。例如:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": os.getenv("DATABASE_NAME", "my_db"),
        ...
        "PORT": os.getenv("DATABASE_PORT", "5432"),
    }
}

...

CHOICES = (
    (LOCATION, "Location"),
    (INTEREST, "Interest"),
    (CULTURE, "Culture"),
)

将函数签名参数拆分为多行,其中它们不适合同一行,每行一个参数,以提高可读性。例子:

def test_user_can_filter_all_communities(
    self,
    filter_field: str,
    filter_value: JSONSerializable,
    include_results: list,
):
    # my code here
    ...

目前对我来说最重要的是后者。

我曾尝试使用autopep8、和pylint,但尽管尝试了不同的配置,但我目前无法使用自动代码格式化程序来实现这一点。yapfblack

当我使用black时,参数如下所示:

def test_user_can_filter_all_communities(
    self, filter_field: str, filter_value: JSONSerializable, include_results: list
):

这让我发疯,因为我喜欢“枚举”我的函数/方法立即采用多少参数。

当我使用yapf它时会发生什么:

def test_user_can_filter_all_communities(self,
                                         filter_field: str,
                                         filter_value: JSONSerializable,
                                         include_results: list):

不幸的是,它仍然不理想,因为我对变量名很冗长,所以从上面的参数继续缩进在很多时候是不可能的,同时还要强制行长度限制。

我习惯于以这种方式编写代码,这种风格让我更有效率,此外还能帮助我发现代码异味和潜在的错误。但是目前我正在自己开发一个中型代码库,并且通过手动格式化来强制执行这种样式占用了我太多的时间。

是否有任何自动代码格式化程序可以帮助我实现这一目标?或者有人知道如何通过上述方法之一实现这一目标吗?

(我确实记得 3 年前在一个项目中工作,我们使用pylintor强制执行这种代码样式black,所以它应该是可行的,但我不知道如何。)

先感谢您。

标签: pythonpylintautopep8yapf

解决方案


在你的最后一个参数后添加一个逗号,黑色会做你想要的。

def test_user_can_filter_all_communities(
    self, filter_field: str, filter_value: JSONSerializable, include_results: list,
):

请参阅:https ://github.com/psf/black/issues/1288


推荐阅读