Python编码风格-多个return语句

T-8*_*800 1 python coding-style pydot

对于同一任务,我编写了两个不同的函数。我想知道哪个更优雅。

任务是检查pydot对象是否包含请求的节点,如果是,则返回节点和图形对象。如果该节点不存在,则需要创建该节点。

为了获得节点的名称,我使用pydot对象get_nodes()函数。但是,如果尚未引入任何节点,则此函数将返回一个空列表。因此,在遍历值之前,我进行了一个空列表检查。

第一个变体(“ variant1”)很容易理解。在进行长度检查(这是由于所必需的)之后node.get_name(),它循环到节点名称,一旦找到要搜索的节点,就返回该节点和图形。如果没有,它将调用一个函数来创建节点并更新图形。尽管此功能易于理解,但恕我直言,它并不美观。它包含两个“ 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)
Run Code Online (Sandbox Code Playgroud)

第二种变体要复杂得多。一旦在图中找到该节点,它就会断开并直接跳到最后一行(“返回节点,图”)。此变体只有一个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
Run Code Online (Sandbox Code Playgroud)

我的问题是,根据“ Python的禅宗”,“ PEP8”或“ Google Python样式指南”,我更喜欢使用哪一个?

jon*_*rpe 6

这是我的写法:

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)
Run Code Online (Sandbox Code Playgroud)

这意味着:

  • 比较操作的可读性更高;
  • 仅一个线路呼叫create_node(干!);
  • 尽管有两return行,但两者都在函数的底部;
  • for: else:(有些人不喜欢-我认为它总体上很有用,但在这里没有必要);和
  • 无需进行不必要的长度检查(如果len(graph.get_nodes)为零,则始终跳过循环)。

PEP-8并不禁止多return行(实际上,样式指南中的某些示例确实包含多行)。我在Google的风格指南中看不到它的引用,但是我没有扩展所有部分!

  • @T-1000 在人们回答之后改变问题是非常糟糕的形式。 (2认同)