2015-08-13 2 views
1

Для этой же задачи я закодировал две разные функции. Я хотел бы знать, какой из них более элегантный.Стиль кодирования Python - несколько операторов возврата

Задача состоит в том, чтобы проверить объект pydot, если он видит запрашиваемый узел, и если да, то вернуть объект и объект графика обратно. Если узел не существует, узел должен быть создан.

Чтобы получить имена узлов, я использую функции pydotget_nodes(). Однако, если еще не введены какие-либо узлы, эта функция возвращает пустой список. Следовательно, перед повторением этих значений я делаю пустую проверку списка.

Первый вариант (вариант 1) легко понять. После проверки длины, которая необходима из-за 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 node, graph»). Этот вариант имеет только один оператор возврата.

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 Style Guide»?

+0

В первом я просто вернул create_node (node_name, graph) '- зачем назначать одну строку? – jonrsharpe

+0

@jonrsharpe вы правы! Я обновлю его. Благодаря! –

+0

Создает ли 'create_node' узел и график? В идеале ваша функция вернет пару узлов/графов независимо от того, создан или нет новый узел. – chepner

ответ

2

Вот как я бы писать:

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, обе находятся в нижней части функции;
  • no for: else: (что некоторым людям не нравится - я думаю, что это полезно вообще, но здесь не нужно); и
  • Нет необходимости в проверке длины (если len(graph.get_nodes) равно нулю, цикл пропускается в любом случае).

PEP-8 не запрещает несколько строк return (действительно, некоторые из примеров в руководстве по стилю имеют их). Я не мог видеть ссылку на него в руководстве по стилю Google, но я не расширил все разделы!

+0

Спасибо за ваш ответ, но нам нужно проверить длину: если 'graph.get_nodes()' возвращает пустой список, вы получите ошибку при получении имени узла ('node.get_name() ') –

+1

@ T-1000 нет, потому что если он возвращает пустой список **, вы никогда не вводите цикл **. Попробуйте это у себя дома: 'for _ in []: print (« Это появилось? »)' – jonrsharpe

+0

вы правы. Я как-то это наблюдал. Я обновил вопрос и хотел бы сейчас посмотреть, что такое общее мнение. –

Смежные вопросы