✧ Стиль кода: PEP 8 ✧

📜 Теория: договорённости о том, как писать красиво

Код читают чаще, чем пишут: сегодня ты, завтра друг из команды, через месяц — снова ты, уже забывший, что здесь происходило. Поэтому у 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)
    ...
⟵ Исключения Условные операторы if-elif-else ⟶