Python с нуля

Разметка

Отступы

Используйте параметры по умолчанию: 4 пробела на один отступ. Для очень старого кода, в который вы не желаете сильно вмешиваться, можете можете продолжать использовать отступы в 8 символов.


Табуляция или пробелы?

Никогда не смешивайте пробелы с табуляцией. Самый популярный способ отступов в Питоне — использовать только пробелы. Второй самый популярный способ — только табуляторы. Код, в котором отступы пробелами и табуляторами перемешаны, надо перевести к отступам пробелами. Когда вы запускаете Питон с параметром , то при использовании смешанных отступов выдаются предупреждения; если задать опцию , то предупреждения станут ошибками. Использование этих опций очень рекомендуется!

Максимальная длина строки

До сих пор существует много устройств, длина строки в которых ограничена 80-ю символами. Поэтому, пожалуйста, установите максимальную длину для всех строк 79 символов.

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

class Rectangle(Blob):
   def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
          highlight > 100:
              raise ValueError, "sorry, you lose"
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError, "I don't think so"
       Blob.__init__(self, widt, height,
                     color, emphasis, highlight)

Пустые строки

Отделяйте функции верхнего уровня и объявления классов двумя пустыми строками. Определения методов внутри класса отделяются одной пустой строкой. Дополнительно пустые строки можно использовать для отделения групп родственных функций. Пустые строки можно опускать внутри связки из одностроковых определений (набора абстрактных методов). Если пустые строки используются для отделения методов в классе, то вставляйте также пустую строку между строкой «class…» и определением первого метода. Используйте пустые строки в функциях для указания логических блоков, но не переусердствуйте.

Пробелы в выражениях и операторах

Я (Pet Peeves) ненавижу пробелы в следующих местах:

Сразу после скобок: spam( ham, { eggs: 2 } ).

Всегда пишите так: spam(ham, {eggs: 2}).

Непосредственно перед двоеточием, точкой с запятой, запятой: if x == 4 : print x , y ; x , y = y , x.

Всегда пишите: if x == 4: print x, y; x, y = y, x.

Перед открывающей скобкой при вызове функции: spam (1)

Всегда пишите: spam(1)

Перед открывающими скобками индекса или разреза: dict = list .

Всегда пишите: dict = list.

Более чем один пробел вокруг присваивания или другого оператора: x = 1 y = 2 long_variable = 3

Всегда пишите так: x = 1 y = 2 long_variable = 3

Другие рекомендации


ВСЕГДА окружайте эти бинарные операторы одинарными пробелами:

  • присваивание
  • сравнения (==, <, >, !=, <>, <=, >=, in, not in, is, is not),
  • Булевы (and, or, not).

Используйте наилучший по вашему мнению выбор при вставке пробелов вокруг арифметических операторов. Всегда будьте последовательны при вставке пробелов в обоих частях бинарного оператора:

i = i+1
submitted = submitted + 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
c = (a + b) * (a - b)

Не используйте пробелы вокруг знака ‘=’ в случае указания значения по умолчанию:

def complex(real, imag=0.0):
    return magic(r=real, i=imag)

Область видимости

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

Например, такой код:


Работает с одной глобальной переменной, а такой:

уже порождает локальную. С моей точки зрения это не очень хорошо, по идее любое использование нелокальных переменных в функции это часть публичного интерфейса функции, её сигнатуры, а значит должно объявляться явно и видимо в начале функции. Также ключевые слова не очень информативны — звучит как определение глобальной функции, а на самом деле означает .

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

такое условие сработает если файл будет вызван как скрипт, а не импортирован как модуль.

Строки и отступы

Одно из самых важных замечаний для тех, кто начал изучать Python — это то, что в нём при обозначении границ блоков кода для классов и функций, а так же для управления потоками, не используются привычные некоторым фигурные скобки. Вместо этого — в Python используются отступы строк.


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

Например, оба блока в примере ниже выполнены правильно:

>>> if True:
...   print "True"
... else:
...   print "False"
...
True

А вот второй блок в следующем примере — приведёт к ошибке интерпретатора ««:

>>> if True:
...   print "Answer"
...   print "True"
... else:
...   print "Answer"
...     print "False"
  File "<stdin>", line 6
    print "False"
    ^
IndentationError: unexpected indent

Таким образом, все линии, имеющие одинаковое количество отступов от начала строки буду формировать блок кода

В примере ниже продемонстрированы блоки с различными операторами (не важно, что какие-то из функций в этом примере вам будут непонятны, главное — постарайтесь понять роль отступов в нём):

#!/usr/local/bin/python

import sys

try:
   # open file stream
   file = open(file_name, "w")
except IOError:
   print "There was an error writing to", file_name
   sys.exit()
print "Enter '", file_finish,
print "' When finished"
while file_text != file_finish:
  file_text = raw_input("Enter text: ")
  if file_text == file_finish:
    # close the file
    file.close
    break
  file.write(file_text)
  file.write("n")
file.close()
file_name = raw_input("Enter filename: ")
if len(file_name) == 0:
  print "Next time please enter something"
  sys.exit()
try:
  file = open(file_name, "r")
except IOError:
  print "There was an error reading file"
  sys.exit()
file_text = file.read()
file.close()
print file_text

С этим читают