具有多个参数和类型提示的方法的悬挂缩进的正确语法是什么?
在第一个参数下对齐
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在情况下支持缩进一级,但未指定是否允许在第一个参数下对齐。它声明:
使用悬挂式缩进时,应考虑以下因素;那里 应该是第一行和进一步缩进没有参数 应该用来清楚地将自己区分为延续线。
答案 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)