Использование этой концепции всеми одобряется: имя любого метода или свойства, к которым клиентский код не должен получить доступ, должно начинаться с нижнего подчеркивания. Это гарантирует более качественное разделение обязанностей и упрощает внесение изменений в код. Всегда можно сделать закрытое свойство открытым, обратное же действие выполнить гораздо сложнее.
Возвращайте значения из одной точки
Когда сложность функции увеличивается, зачастую вы можете встретить несколько выражений return в теле этой функции. Однако для того, чтобы ее было проще понять и прочесть, возвращайте осмысленные значения из минимально возможного количества точек.
Выйти из функции можно в двух случаях: при появлении ошибки или при возвращении значения после того, как функция нормально отработает. Когда функция не может работать корректно, уместно вернуть значение None или False. В этом случае лучше вернуть значение из функции максимально рано после его обнаружения, дабы упростить структуру функции: весь код, который находится после выражения возврата-в-случае-сбоя, будет считать, что все условия соблюдены, и продолжит вычисление основного результата функции. Необходимы несколько подобных выражений return.
Однако везде, где это возможно, имейте только одну точку выхода — сложно выполнять отладку для функций, когда вам сначала нужно определить, какое выражение return ответственно за результат. Наличие единой точки выхода из функции также поможет избавиться от некоторых ветвей кода, поскольку наличие пары точек выхода, возможно, намекает на то, что необходимо провести подобный рефакторинг. Код в следующем примере нельзя назвать плохим, но его можно сделать более чистым (как это показано в комментариях):
def select_ad(third_party_ads, user_preferences):
····if not third_party_ads:
········return None # Лучше сгенерировать исключение
····if not user_preferences:
········return None # Лучше сгенерировать исключение
····# Сложный код, предназначенный для выбора best_ad
····# Из доступных вариантов на основе индивидуальных предпочтений…
····# Постарайтесь устоять перед искушением вернуть best_ad в случае успеха…
····if not best_ad:
········# Запасной план определения best_ad
····return best_ad # Единая точка выхода, которая поможет обслуживать код
Соглашения важны для всех, но это не единственный способ решения задачи. Соглашения, приведенные в этом разделе, довольно распространены, и мы рекомендуем придерживаться их, чтобы сделать свой код более читаемым.
Альтернативы при проверке на равенство
Если вам не нужно явно сравнивать свое значение со значением True, None или 0, вы можете добавить его к оператору if, как в следующих примерах (см. статью «Проверка значения на правдивость» ( http://docs.python.org/library/stdtypes.html#truth-value-testing) — там представлен список значений, которые расцениваются как False).
Плохой код |
Хороший код |
if attr == True: |
# Просто проверяем значение |
····print 'True!' |
if attr: |
|
····print 'attr is truthy!' |
|
# или проверяем на противоположное значение |
|
if not attr: |
|
····print 'attr is falsey!' |
|
# если вам нужно только значение 'True' |
|
if attr is True: |
|
····print 'attr is True' |
if attr == None: |
# или явно проверяем на значение None |
····print 'attr is None!' |
if attr is None: |
|
····print 'attr is None!' |
Получаем доступ к элементам массива
Используйте синтаксис x in d вместо метода dict.has_key или передавайте аргумент по умолчанию в метод dict.get().
Плохой код |
Хороший код |
>>> d = {'hello': 'world'} |
>>> d = {'hello': 'world'} |
>>> |
>>> |
>>> if d.has_key('hello'): |
>>> print d.get('hello', 'default_value') |
… ····print(d['hello']) |
world |
# prints 'world' |
>>> print d.get('howdy', 'default_value') |
… else: |
default_value |
… ····print('default_value') |
>>> |
… |
>>> # или: |
world |
… if 'hello' in d: |
|
… ····print(d['hello']) |
|
… |
|
world |
Манипуляции со списками
Списковые включения — мощный способ работы со списками (для получения более подробной информации обратитесь к соответствующей статье в руководстве The Python Tutorial по адресу http://docs.python.org/tutorial/datastructures.html#list-comprehensions). Функции map() и filter() могут выполнять операции со списками с помощью другого, более выразительного синтаксиса.
Читать дальше