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

时间:2016-09-12 19:39:21

标签: python python-3.x pep8 type-hinting

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

在第一个参数下对齐

def get_library_book(self,
                     book_id: str,
                     library_id: str
                     )-> Book:

下面缩进一级
def get_library_book(
    self, 
    book_id: str, 
    library_id: str
) -> Book:

PEP8在情况下支持缩进一级,但未指定是否允许在第一个参数下对齐。它声明:

  

使用悬挂式缩进时,应考虑以下因素;那里   应该是第一行和进一步缩进没有参数   应该用来清楚地将自己区分为延续线。

3 个答案:

答案 0 :(得分:2)

来自Terrys的公寓回答,以typeshed为例,这是Python的GitHub上用于使用存根来注释stdlib的项目。

例如,在importlib.machinery中(在其他情况下,如果您查看)注释是使用您的第一个表单for example完成的:

def find_module(cls, fullname: str,
                path: Optional[Sequence[importlib.abc._Path]]
               ) -> Optional[importlib.abc.Loader]:

答案 1 :(得分:2)

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<_>>>());

这是来自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<_>>>()
);

或者,如果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<_>>>()
);

与列对齐样式相比,这种纯粹的缩进样式具有许多优点,并且没有任何缺点。

答案 2 :(得分:1)

仔细阅读PEP 8的上一行,&#34;之前的部分;或使用悬挂式缩进&#34;。

  

延续线应使用Python在括号,括号和大括号内的隐式线连接或使用悬挂缩进来垂直对齐包装元素。

这是为了涵盖第一个&#34;是&#39;例如,上面的第一个例子。

# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
                         var_three, var_four)