对于同样的任务,我编写了两个不同的功能。我想知道哪一个更优雅使用。
任务是检查pydot
对象是否显示请求的节点,如果是,则返回节点和图形对象。
如果节点不存在,则需要创建节点。
要获取节点的名称,我使用pydot
对象get_nodes()
函数。但是,如果还没有引入任何节点,则此函数返回一个空列表。因此,在迭代值之前,我会检查一个空列表。
第一个变体('variant1')很容易理解。在长度检查之后,由于node.get_name()
,这是必要的,它会循环到节点名称,一旦找到正在搜索的节点,就会返回节点和图形。如果没有,它会调用一个创建节点并更新图形的函数。虽然这个功能很容易理解,但恕我直言并不优雅。它看到了两个“回归”陈述:
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语句。
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风格指南”,我应该选择使用哪一个?
答案 0 :(得分:4)
以下是我的写作方式:
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
(DRY!); return
行,但它们都位于函数的底部; for: else:
(有些人不喜欢 - 我认为它一般有用,但这里不必要);和len(graph.get_nodes)
为零,则无论如何都会跳过循环)。 PEP-8并不禁止多个return
行(实际上,样式指南中的一些示例确实有这些行)。我无法在Google的风格指南中看到它的引用,但我没有扩展所有部分!