возврат из функции сразу после вызова другой функции - PullRequest
3 голосов
/ 05 февраля 2012

Функция calculate_attribute не возвращает значение; это работает только через побочные эффекты.

Часто внутри этой функции мне приходится писать следующие строки:

print('some message')
set_attribute(value)
return

Поэтому я решил поместить это в другую функцию:

def report_and_set(value, message):
  print(message)
  set_attribute(value)

Можно ли теперь делать следующее:

   def calculate_attribute(params):
     #...
     if something:
       return report_and_set(value, message)
     #...
     if another_condition:
       return report_and_set(value, message)
     #...     

Писать это странно, поскольку report_and_set не имеет возвращаемого значения. Но если я этого не сделаю, мне придется неоднократно набирать return после каждого вызова report_and_set.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2012

Ну, вам нужно каждый раз вводить return. Я не уверен, что вы получаете (или теряете), делая это так, как вы предлагаете, тем более что

return

фактически совпадает с

return None

Но мне интересно, почему у вас вообще есть эти пустые операторы return в функции. Это необходимо? Может быть более элегантный или более легкий для чтения способ обработки потока управления в этой функции. Случайный return в середине функции может быть легко пропустить.

Говоря более абстрактно, подсчет операторов возврата является хорошей грубой эвристикой для измерения сложности функций; Большую часть времени большее возвращение подразумевает большую цикломатическую сложность . Есть даже школа мысли, которая настаивает на использовании return только один раз в любой заданной функции, основанной на часто цитируемом принципе «один вход, один выход». На самом деле, я думаю, что «один вход, один выход» отличается от «только один возврат», что мне кажется довольно строгим и порой обременительным. (Подробнее см. в этом посте , в котором говорится, что «только один возврат» основан на неправильном понимании SESE). Но общий принцип о том, что меньшее количество return утверждений лучше, все же кажется мне хорошим.

1 голос
/ 05 февраля 2012

Многие программисты, включая меня, предпочитают по одному return на функцию .

Иногда я могу вставить return в первые несколько строк функции, чтобы выполнить ее в случае сбоя при проверке работоспособности.

Я бы не стал в этом случае.

В этом случае я бы просто сделал ...

   def calculate_attribute(params):
     #...
     if something:
       report_and_set(value, message)
     #...
     elif another_condition:
       report_and_set(value, message)
     #...     

Но также рассмотрим Принцип единой ответственности (он в равной степени относится к функциям и классам). Если ваша функция длинная и содержит много вызовов условных функций, вероятно, настало время рефакторинга !

0 голосов
/ 05 февраля 2012

Да, это нормально.

Нет, в этом нет ничего плохого.

Продолжайте.

...