Код читают чаще, чем пишут: сегодня ты, завтра друг из команды, через месяц — снова ты, уже забывший, что здесь происходило. Поэтому у Python есть свод договорённостей о внешнем виде кода — PEP 8. Это не закон: программа с «некрасивым» кодом запустится и заработает. Но так пишет весь мир, и глаза у всех к этому привыкли.
Проверяет код на соответствие этим договорённостям специальная программа — линтер. Она находит не только неаккуратные пробелы, но и настоящие промахи: переменную, которую создали и забыли, или импорт, который не нужен. В песочнице курса есть кнопка проверки, мы к ней вернёмся ниже.
# Отступ — 4 пробела на каждый уровень, табуляцию не используем
def bonus(level):
if level >= 20:
return "возвышение"
return "качаем дальше"
# Строка — не длиннее 79 знаков; длинное выражение переносим внутри скобок
message = ("Путешественник дошёл до подземелья, взял сундук "
"и отправился дальше по сюжету")
# Плохо
hp=100
total = (hp+20)*2
party = ["Эмбер","Кэйа" , "Лиза"]
print( total )
# Хорошо: вокруг операторов пробелы, после запятой пробел, внутри скобок — нет
hp = 100
total = (hp + 20) * 2
party = ["Эмбер", "Кэйа", "Лиза"]
print(total)
# Исключение: в именованных аргументах и значениях по умолчанию вокруг «=» пробелов нет
print("Привет", end="")
def attack(power, crit_rate=0.5):
return power * (1 + crit_rate)
# Переменные и функции — строчными буквами, слова через подчёркивание (snake_case)
hero_name = "Эмбер"
def count_primogems(wishes):
return wishes * 160
# Классы — каждое слово с большой буквы, без подчёркиваний (CapWords)
class ArtifactSet:
pass
# Константы — заглавными буквами
MAX_LEVEL = 90
# Одиночные «l», «O», «I» не используем: их легко спутать с единицей и нулём
level = 5 # а не l = 5
import math # каждый импорт — в отдельной строке, всё в начале файла
import random
def roll_artifact(): # перед функцией и после неё — две пустые строки
return random.randint(1, 5)
class Team:
def __init__(self):
self.members = []
def add(self, hero): # между методами класса — одна пустая строка
self.members.append(hero)
# Комментарий начинаем с «# » (решётка и пробел)
x = 1 # перед комментарием в строке с кодом — два пробела
# Плохо
if buff == True:
pass
if hero == None:
pass
# Хорошо: условие пишем как есть, с None сравниваем через is
if buff:
pass
if hero is None:
pass
Открой песочницу и напиши или вставь код. Нажми «стиль»: проблемные места подсветятся в самом коде жёлто-оранжевым цветом, а под кнопками появится список замечаний. Наведи курсор на подсвеченное место, и появится подсказка. Нажми на строку списка: редактор перейдёт к нужному месту. Если красным подсвечена «ошибка», значит код нельзя даже запустить: в нём синтаксическая ошибка, исправь её сначала.
Исправляешь код — замечания обновляются сами через пару секунд. Чтобы убрать подсветку, нажми крестик в списке.
Рядом с кнопкой есть шестерёнка ⚙: за ней спрятаны наборы проверок, которые можно включать и выключать галочками. Сначала включены три главных: оформление по PEP 8, имена и «ошибки и мусор» (лишние импорты и переменные, несуществующие имена). Остальные помогают, когда основное уже в порядке: порядок импортов, «можно проще», подозрительные приёмы, строки документации, современный Python, сложность функций и самый строгий набор.
💬 Можно спросить и Паймон: «чем мой код не соответствует PEP 8?». Она посмотрит на результат проверки и расскажет, что не так и зачем нужно правило.
Путешественник наспех написал код для расчёта урона. Он работает, но выглядит как после боя с хиличурлами. Приведи его в порядок, чтобы кнопка «стиль» с тремя включёнными по умолчанию наборами не находила замечаний.
import os,sys
def CalcDamage( atk,crit_rate = 0.5 ):
l=atk*(1+crit_rate)
if l == None : return 0
return l
Hero = "Эмбер"
print( CalcDamage(100,0.7) , Hero )
Что нужно сделать:
Здесь есть лишние импорты, имена не по правилам (функция и переменная l), неправильные пробелы, сравнение с None через == и два оператора в одной строке. Заодно переименуй Hero в hero: линтер этого не требует, но по PEP 8 переменные пишут строчными буквами. Вот как выглядит порядок в самом начале:
def calc_damage(atk, crit_rate=0.5):
damage = atk * (1 + crit_rate)
...