4

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

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

为了获取节点的名称,我使用了pydotobjectsget_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)

第二种变体,要复杂得多。一旦在图中找到节点,它就会中断并直接跳转到最后一行('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

我的问题是,根据“The Zen of Python”、“PEP8”还是“Google Python Style Guide”,我应该更喜欢使用哪一个?

4

1 回答 1

9

我是这样写的:

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 的风格指南中看不到对它的引用,但我没有展开所有部分!

于 2015-08-13T15:13:09.257 回答