有了pylint,我知道在将“ return”放在“ else”中时会触发R1705警告。
这是警告:
R1705: Unnecessary "else" after "return" (no-else-return)
这就是文档所说的:
Unnecessary “else” after “return” Used in order to highlight an unnecessary block of code following an if containing a return statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a return statement.
触发R1705的代码片段:
if CONDITION1:
return something1
else:
return something2
Run Code Online (Sandbox Code Playgroud)
所需的修复程序来关闭警告:
if CONDITION1:
return something1
return something2
Run Code Online (Sandbox Code Playgroud)
真的需要遵守吗?有什么好处?我的意思是我了解,从函数返回某些内容后,将无法返回并阅读更多代码。
但是我发现使用“ else”更有条理。
如果您尝试遵循Mozilla编码风格 或类似风格,则R1705很有意义。报价:
不要在返回(或休息)后立即输入其他内容。删除else,这是不必要的,并增加了缩进级别。
否则,您可能希望禁用该警告。更好的是,考虑切换到flake8
,如果您一直在编写明智的代码,则倾向于保持沉默。
在Mozilla社区之外,大多数人宁愿看到使用来处理简单的并行函数子句else
,如下所示:
def max(a, b):
if a > b:
return a
else:
return b
Run Code Online (Sandbox Code Playgroud)
这篇文章给出了此设计决策的两种不同情况:
守卫条款。
def try_something()
if precondition():
result = compute_something()
return result
else:
display_error()
return None
Run Code Online (Sandbox Code Playgroud)作者认为,对于几个这样的条件,它们的反转 和implicit else
更好:
# Implicit else, inverted condition
def try_something():
if not precondition_one():
display_error_one()
return
if not precondition_two():
display_error_two()
return
result = compute_something()
return result
Run Code Online (Sandbox Code Playgroud)
对称子句。
# Explicit else
def check_link(link) -> bool:
if is_internal_link(link):
return check_internal_link(link)
else:
return check_external_link(link)
Run Code Online (Sandbox Code Playgroud)我同意作者的观点,这里明确更好。
我还要引用那篇文章的评论,它说这个选择是范式的选择:
- “显式 else”:“if-then-else”被视为惰性计算,更适合“功能优先”环境。如果这种“if-then-else”应用于大型数据集和 F#、Scala、Haskel、Closure 甚至 SQL 中的代码 - 显式性是首选。最有可能的是,语言/平台本身会鼓励编写“纯”代码,并阻止/使几乎不可能做出命令式的特技。
- “隐式 else/(显式返回)”:计算 100% 取决于副作用,结果也是副作用的组合。无论如何,不可能保证严格意义上的正确性,因此显式返回成为明确的声明:“由于我们宇宙中的物理定律,此计算可能会不正确。在大多数情况下,将返回此默认值”。
归档时间: |
|
查看次数: |
237 次 |
最近记录: |