在python中使用类型提示挂起缩进的适当缩进级别是多少?

Nel*_*lly 7 python pep8 type-hinting python-3.x

具有多个参数和类型提示的方法的悬挂缩进的正确语法是什么?

在第一个参数下对齐

def get_library_book(self,
                     book_id: str,
                     library_id: str
                     )-> Book:
Run Code Online (Sandbox Code Playgroud)

缩进一层

def get_library_book(
    self, 
    book_id: str, 
    library_id: str
) -> Book:
Run Code Online (Sandbox Code Playgroud)

PEP8支持凹槽下面的一个级别,但不指定是否允许在第一个参数下进行对齐.它指出:

使用悬挂式凹痕时,应考虑以下因素; 第一行应该没有参数,应该使用进一步的缩进来明确区分自己作为延续线.

Mic*_*ary 8

PEP8 中有很多很好的想法,但我不会依赖它来决定这种关于空格的问题。当我研究 PEP8 关于空白的建议时,我发现它们不一致甚至相互矛盾。

相反,我会研究适用于几乎所有编程语言的一般原则,而不仅仅是 Python。

第一个示例中显示的列对齐有很多缺点,我不会在我的任何项目中使用或允许它。

一些缺点:

  • 如果更改函数名称使其长度不同,则必须重新对齐所有参数。
  • 当您进行重新调整时,您的源代码控制差异会因不必要的空白更改而变得混乱。
  • 随着代码的更新和维护,您可能会在重命名变量时遗漏某些对齐方式,从而导致代码未对齐。
  • 你会得到更长的线长。
  • 对齐在比例字体中不起作用。(是的,一些开发人员更喜欢比例字体,如果您避免列对齐,您的代码在等宽或比例字体中的可读性相同。)

如果在更复杂的情况下使用列对齐,情况会更糟。考虑这个例子:

let mut rewrites = try_opt!(subexpr_list.iter()
                                        .rev()
                                        .map(|e| {
                                            rewrite_chain_expr(e,
                                                               total_span,
                                                               context,
                                                               max_width,
                                                               indent)
                                        })
                                        .collect::<Option<Vec<_>>>());
Run Code Online (Sandbox Code Playgroud)

这是来自 Servo 浏览器的 Rust 代码,其编码风格要求这种列对齐。虽然它不是 Python 代码,但完全相同的原则适用于 Python 或几乎任何语言。

在此代码示例中,列对齐的使用如何导致糟糕的情况应该很明显。如果你需要在嵌套rewrite_chain_expr调用中调用另一个函数,或者有一个更长的变量名怎么办?除非您想排长的队,否则您几乎没有空间了。

将上述版本与使用纯基于缩进的样式的任一版本进行比较,例如您的第二个 Python 示例:

let mut rewrites = try_opt!(
    subexpr_list
        .iter()
        .rev()
        .map( |e| {
            rewrite_chain_expr( e, total_span, context, max_width, indent )
        })
        .collect::<Option<Vec<_>>>()
);
Run Code Online (Sandbox Code Playgroud)

或者,如果 to 的参数rewrite_chain_expr更长,或者您只想要更短的行:

let mut rewrites = try_opt!(
    subexpr_list
        .iter()
        .rev()
        .map( |e| {
            rewrite_chain_expr(
                e,
                total_span,
                context,
                max_width,
                indent
            )
        })
        .collect::<Option<Vec<_>>>()
);
Run Code Online (Sandbox Code Playgroud)

与列对齐样式相比,这种纯缩进样式有很多优点,完全没有缺点。