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
    ...

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

我曾尝试使用 autopep8pylintyapfblack,但尽管为每个尝试了不同的配置,但我目前无法通过自动代码格式化程序。

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

def test_user_can_filter_all_communities(
    self,include_results: list
):

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

当我使用 yapf 时会发生这种情况:

def test_user_can_filter_all_communities(self,include_results: list):

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

我习惯于以这种方式编写代码,这种风格不仅能帮助我发现代码异味和潜在错误,而且还能提高工作效率。但目前我正在自己开发一个中等规模的代码库,通过手动格式化来强制执行这种风格占用了我太多时间。

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

(我确实记得 3 年前在一个项目中工作,我们使用 pylintblack 强制执行此代码样式,因此它应该以某种方式可行,但我不知道如何。 )

提前致谢。

解决方法

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

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

见:https://github.com/psf/black/issues/1288