2010-12-28 4 views
2

Есть ли какие-либо рекомендации о том, когда следует прекратить методы цепочки и вместо этого разбить цепочку на несколько выражений?Цепочка метода - сколько цепляемых методов достаточно?

Рассмотрите, например, этот Python код, который создать словарь, словом, как ключ и соответствующий кол в качестве значения:

def build_dict(filename): 
    with open(filename, 'r') as f: 
     dict = defaultdict(int) 

     for word in f.read().lower().split(): # too much? 
      dict[word] += 1 

     return dict 

ли сцепление 3 методы хорошо? Получил бы я какую-нибудь заметную выгоду, разделив выражение?

+3

Nitpick. Не приписывайте 'dict', который скрывает встроенный. Возможно, переименуйте его в 'word_count' и переименуйте функцию в' count_words'. Я не вижу никаких проблем с тремя способами, которые вы связываете. Я могу сразу понять, что вы делаете. –

ответ

3

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

6

Какой смысл связывать только два? Если вы делаете метод цепочки, сделайте это правильно.

Это больше вопрос форматирования, если он получает много для одной строки, я предпочитаю

(x.Foo() 
    .Bar() 
    .FooBar() 
    .Barf()); 

Другой вопрос может быть отладчики, которые заставляют вас проследить в Foo, если вы хотите, чтобы проследить в Bar ,

+2

Конечно, этот синтаксис является незаконным в Python. – robert

+0

d'oh! Вы правы, конечно. Есть ли альтернатива длинным цепочкам, которые работают в python? (Мой единственный опыт работы с python возится со сценариями сборки и надеется, что я не сломаюсь) – peterchen

+3

Поместите круглые скобки вокруг всего выражения, и он будет работать нормально. – Duncan

3

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

Если вы уверены, что исключение не произойдет, то

for word in f.read().lower().split(): 
    dict[word] += 1 

может быть предпочтительнее

contents=f.read() 
contents=contents.lower() 
words=contents.split() 
for word in words: 
    d[word] += 1 

, так как память расходуется на строку contents и список words и не высвобождается, пока этот блок кода заканчивается (если не считать других ссылок на одни и те же объекты). Поэтому, если память плотная, вы можете рассмотреть вопрос о цепочке.

Если память не является проблемой, особенно если words или contents могут быть использованы позже в коде, а затем назначить переменную для ссылки на них, конечно, будет быстрее, так как read, lower и/или split методы выиграли» t нужно вызвать снова.

+0

Я думаю, что память не является проблемой, так как стандартная реализация подсчитывается с помощью ссылки –

+0

Да, но область применения более жесткая, когда они меняются, и gc свободен для очистки объектов раньше. – Falmarri

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