Python 编码风格 - 多个 return 语句
Python coding style - multiple return statements
对于同一个任务,我编写了两个不同的函数。我想知道哪个用起来比较优雅
任务是检查 pydot
对象是否看到请求的节点,如果是,则返回 return 节点和图形对象。
如果该节点不存在,则需要创建该节点。
为了获取节点的名称,我使用了 pydot
objects get_nodes()
函数。但是,如果尚未引入任何节点,则此函数 return 是一个空列表。因此,在遍历值之前,我进行了空列表检查。
第一个变体('variant1')很容易理解。在长度检查之后,由于 node.get_name()
,这是必要的,它循环到节点名称,一旦找到正在搜索的节点,节点和图形就会被 returned。如果不是,它会调用一个函数来创建节点并更新图形。虽然这个功能很容易理解,恕我直言,它并不优雅。它看到两个“return”语句:
def variant1(node_name, graph):
if len(graph.get_nodes()) > 0:
for node in graph.get_nodes():
if node_name == node.get_name():
return node, graph
return create_node(node_name, graph)
第二种变体,要复杂得多。一旦在图中找到节点,它就会中断并直接跳到最后一行('return node, graph')。此变体只有一个 return 语句。
def variant2(node_name, graph):
if len(graph.get_nodes()) > 0:
for node in graph.get_nodes():
if node_name == node.get_name():
break
else:
# the node doesnt exist. create it and update the graph
node, graph = create_node(node_name, graph)
else:
# create the first node in the graph
node, graph = create_node(node_name, graph)
return node, graph
我的问题是,根据“Python 之禅”、“PEP8”或“Google Python 风格指南”,我应该更喜欢使用哪一个?
我会这样写:
def variant1a(node_name, graph):
"""Include a docstring, too!"""
for node in graph.get_nodes():
if node.get_name() == node_name:
return node, graph
return create_node(node_name, graph)
这意味着:
- 比较操作的顺序更易读;
- 只有一行调用
create_node
(干!);
- 虽然有两行
return
,但都在函数的底部;
- no
for: else:
(有些人不喜欢 - 我认为它在一般情况下很有用,但在这里没有必要);和
- 没有不必要的长度检查(如果
len(graph.get_nodes)
为零,无论如何都会跳过循环)。
PEP-8 不禁止多个 return
行(事实上,样式指南中的一些示例确实有它们)。我在 Google 的风格指南中看不到对它的引用,但我没有展开所有部分!
对于同一个任务,我编写了两个不同的函数。我想知道哪个用起来比较优雅
任务是检查 pydot
对象是否看到请求的节点,如果是,则返回 return 节点和图形对象。
如果该节点不存在,则需要创建该节点。
为了获取节点的名称,我使用了 pydot
objects get_nodes()
函数。但是,如果尚未引入任何节点,则此函数 return 是一个空列表。因此,在遍历值之前,我进行了空列表检查。
第一个变体('variant1')很容易理解。在长度检查之后,由于 node.get_name()
,这是必要的,它循环到节点名称,一旦找到正在搜索的节点,节点和图形就会被 returned。如果不是,它会调用一个函数来创建节点并更新图形。虽然这个功能很容易理解,恕我直言,它并不优雅。它看到两个“return”语句:
def variant1(node_name, graph):
if len(graph.get_nodes()) > 0:
for node in graph.get_nodes():
if node_name == node.get_name():
return node, graph
return create_node(node_name, graph)
第二种变体,要复杂得多。一旦在图中找到节点,它就会中断并直接跳到最后一行('return node, graph')。此变体只有一个 return 语句。
def variant2(node_name, graph):
if len(graph.get_nodes()) > 0:
for node in graph.get_nodes():
if node_name == node.get_name():
break
else:
# the node doesnt exist. create it and update the graph
node, graph = create_node(node_name, graph)
else:
# create the first node in the graph
node, graph = create_node(node_name, graph)
return node, graph
我的问题是,根据“Python 之禅”、“PEP8”或“Google Python 风格指南”,我应该更喜欢使用哪一个?
我会这样写:
def variant1a(node_name, graph):
"""Include a docstring, too!"""
for node in graph.get_nodes():
if node.get_name() == node_name:
return node, graph
return create_node(node_name, graph)
这意味着:
- 比较操作的顺序更易读;
- 只有一行调用
create_node
(干!); - 虽然有两行
return
,但都在函数的底部; - no
for: else:
(有些人不喜欢 - 我认为它在一般情况下很有用,但在这里没有必要);和 - 没有不必要的长度检查(如果
len(graph.get_nodes)
为零,无论如何都会跳过循环)。
PEP-8 不禁止多个 return
行(事实上,样式指南中的一些示例确实有它们)。我在 Google 的风格指南中看不到对它的引用,但我没有展开所有部分!