如何在 Python 中的函数调用中正确缩进多行参数列表

How to indent correctly multi-line list of arguments inside function call in Python

我想创建这个多行函数调用。我为嵌套结构找到的示例他们假设每行都有一个字符开始我找不到一个示例,其中括号 [ 后跟括号 (,中间没有任何内容。

那么我该如何格式化:

  subprocess.run(['docker-compose', '-f', 'docker-compose.test.yml', '-f',
                   'docker-compose.services.yml', '-f', 'docker-compose.dev.yml', 'down'],
                 stdout=subprocess.DEVNULL
  )

支架应该放在哪里?我应该如何格式化参数列表?如果我在同一条线上有多个,可以吗?或者每个参数都应该有自己的行

你可以这样做

import subprocess

subprocess.run(
    [
        'docker-compose', '-f', 'docker-compose.test.yml', '-f',
        'docker-compose.services.yml', '-f', 'docker-compose.dev.yml', 'down'
    ],
    stdout=subprocess.DEVNULL
)

我个人喜欢用black来回答格式化的问题。它比 PEP8 更严格,并做出了一些我并不总是同意的艰难决定,但我实际上已经开始系统地使用它,它确实节省了很多浪费时间担心格式化。

以下是黑色对这段代码的处理:

subprocess.run(
    [
        "docker-compose",
        "-f",
        "docker-compose.test.yml",
        "-f",
        "docker-compose.services.yml",
        "-f",
        "docker-compose.dev.yml",
        "down",
    ],
    stdout=subprocess.DEVNULL,
)

我不得不说,如果我手动格式化它,我更愿意将开关和它们的值保持在同一行,所以我可能会这样做:

subprocess.run(
    [
        "docker-compose",
        "-f", "docker-compose.test.yml",
        "-f", "docker-compose.services.yml",
        "-f", "docker-compose.dev.yml",
        "down",
    ],
    stdout=subprocess.DEVNULL,
)

而且我也认为 prnvbn 的回答同样好。

现在,PEP8 实际上对这一切并不严格,我认为它接受了几个关于放置结束 ]) 的选项,而且它似乎也很灵活地决定第一个元素是否与包含它或不包含它的内容出现在同一行。虽然我不太喜欢你的格式,但它实际上可能仍然符合 PEP8,除了你的第二行超过 79 个字符。

正如其他人所说,PEP8 对此提供了几个选项,在这些选项之间,您选择哪个是个人喜好的问题。就个人而言,我喜欢我的代码行紧凑,中间有许多白线,以便在我做不同的事情时进行区分(例如,初始化变量与计算某些东西)。在这种情况下,我会选择(即我个人的偏好):

  subprocess.run(['docker-compose', '-f',
                  'docker-compose.test.yml', '-f',
                  'docker-compose.services.yml', '-f',
                  'docker-compose.dev.yml', 'down'],
                 stdout=subprocess.DEVNULL)

但是请注意,如果您是在项目上下文中编写此代码或在处理其他人开始的代码时,您通常希望遵循代码已经显示的首选项和样式。