2013-07-24 4 views
3

У меня есть метод, который возвращает несколько элементов.Чистое назначение возврата python

def multiReturn(): 
    return 1,2,3,4 

и Im назначая его на одной линии

one, two, three, four = multiReturn() 

Есть ли способ очистки выше линии

Что-то вроде:

one, 
two, 
three, 
four = multiReturn() 

, потому что у меня есть некоторые имена переменных которые стали большими, и ширина страницы беспокоит меня.

Любые идеи, чтобы очистить его

+3

По моему скромному мнению, ваша ситуация является сильным намеком на то, что поведение, которое вы хотите реализовать с этим кортежем, должно быть абстрагировано в своем собственном классе с помощью 'multiReturn()' в качестве его конструктора. –

ответ

10

Вы можете использовать круглые скобки:

(
    one, 
    two, 
    three, 
    four 
) = range(4) 
+3

Однако это вряд ли чище. – delnan

+0

@ delnan Nope ...в этом случае - это менее понятно, чем оригинал ...;) Просто показывая «правильный» способ сделать многострочную группировку –

2

Используйте обратную косую черту в конце каждой строки.

one, \ 
two, \ 
three, \ 
four = multiReturn() 
+0

Недавно мне научили, что когда вы это делаете, он говорит интерпретатору игнорировать следующий символ, который в обычном случае при использовании обратных косых черт будет символом новой строки. Тем не менее, это может быть другой символ, если вы делаете опечатку или оставляете там комментарий. Поэтому будьте осторожны. – 2rs2ts

8

Если вы возвращение так много пунктов уже, рассмотреть вопрос о создании структуры данных некоторого вида. Класс должен быть хорошим, но если вы считаете его излишним, вы можете использовать dict или даже namedtuple.

# First define the structure 
myStruct = namedtuple('myStruct', ['item1', 'item2', 'item3', 'item4']) 

# Then use it 
def multiReturn(): 
    return myStruct(1,2,3,4) 

# No unpacking required! 
this_is_awesome = multiReturn() 
+1

+1 для 'namedtuple'. – kindall

+1

Мне это нравится, так как оно также имеет преимущество в том, чтобы сделать возвращаемое значение из функции немного более самодокументирующимся ... –

-1

Сократите свои имена переменных.

Нет, действительно. Если вы не можете соответствовать обычным ограничениям ширины, это намек на необходимость рефакторинга. Позвольте мне дойти до этого.

Чтобы оставаться ясным, имена должны быть короткими. С другой стороны, вам нужно, чтобы они описывали значение, которое они удерживают, или код, который они выполняют (в случае функций и т. Д.)

Если вам сложно описать значение и, держите имя коротким, это означает, что для любого человека , читающего ваш код, будет, скорее всего, еще намного сложнее читать и понимать, так как вы делаете , они концентрируются на нескольких вещах.

Для comaprison, если я пишу что-то вроде:

class App(): 

    def __init__(self): 

     self.config = {} 
     self.error = "" 
     # ... 
     configDatabaseConnection = mydbmodule.conect(credentials) 
     configQuery = "this and that" 
     config = configDatabaseConnection.query(configQuery) 
     configDatabaseConnectionErrorString = (configDatabaseConection.error) 
     if configDatabaseConnectionErrorString: 
      raise configError(configDatabaseConnectionErrorString) 
     # ... 

это обычно означает, что мне нужно отделить configutation другому методу, и использовать вместо:

class App(): 

    def __init__(self, credentials): 

     self.config = self.load_config(credentials) 
     self.error = "" 
     # ... 

     self.load_config() 

    def load_config(self, credentials): 

     conn = mydbmodule.conect(credentials) 
     q = "this and that" 
     config = conn.query(q) 
     if conn.error: 
      raise configError(conn.error) 
     self.config = config 

который гораздо более читабельным и позволяет добавлять больше логики в процедуру настройки (скажем, откидывания, чтение из файла вместо db ...) без загромождения сути моего кода.

+2

Я действительно не думаю, что это ответ ... –

+0

@RickyMutschlechner Да, это был немного * слишком короткий *. Я попытался подробно остановиться на этом. –

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