← Назад к вопросам

Как правильно ставить отступы в Python?

1.0 Junior🔥 101 комментариев
#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как правильно ставить отступы в Python

Отступы в Python — это не стиль, это синтаксис языка. Неправильные отступы приведут к синтаксической ошибке. Разберёмся с правилами и best practices.

Базовое правило

Python использует отступы для обозначения блоков кода (вместо скобок как в других языках):

if x > 0:
    print("x положителен")  # Отступ обязателен!
    if x > 10:
        print("x очень большой")  # Двойной отступ
else:
    print("x не положителен")

Правило 1: Используй 4 пробела (не табуляции!)

PEP 8 (официальный стандарт Python) требует:

# ✅ ПРАВИЛЬНО: 4 пробела
def function():
    if True:
        return "Hello"

# ❌ НЕПРАВИЛЬНО: табуляции
def function():
	if True:
		return "Hello"

# ❌ НЕПРАВИЛЬНО: 2 пробела
def function():
  if True:
    return "Hello"

# ❌ НЕПРАВИЛЬНО: смешивание пробелов и табуляций
def function():
    if True:  # 4 пробела
		return "Hello"  # табуляция — ERROR!

Почему 4 пробела?

  • PEP 8 рекомендует 4 пробела
  • Хорошо видно на мониторе
  • Стандартный формат во всех компаниях
  • IDE автоматически преобразует Tab в 4 пробела

Правило 2: Уровни вложенности

Каждый уровень вложенности добавляет 4 пробела:

# Уровень 0 — модульный уровень
VARIABLE = 10

# Уровень 1 — внутри функции (4 пробела)
def my_function():
    x = 5
    
    # Уровень 2 — внутри if (8 пробелов)
    if x > 0:
        y = 10
        
        # Уровень 3 — внутри вложенного if (12 пробелов)
        if x > 100:
            z = 20
            print(z)

# Уровень 1 — внутри класса (4 пробела)
class MyClass:
    attribute = 10
    
    # Уровень 2 — внутри метода (8 пробелов)
    def method(self):
        local_var = 5
        
        # Уровень 3 — внутри условия (12 пробелов)
        if local_var > 0:
            result = local_var * 2
            return result

Правило 3: Классические конструкции

Функции:

def add(a, b):
    return a + b  # 1 отступ (4 пробела)

Условия:

if condition:
    do_something()  # 1 отступ
elif other_condition:
    do_other_thing()  # 1 отступ
else:
    do_default()  # 1 отступ

Циклы:

for item in items:
    print(item)  # 1 отступ
    if item > 10:
        print("Big item")  # 2 отступа

while condition:
    do_something()  # 1 отступ

Классы:

class Animal:
    species = "Unknown"  # 1 отступ (атрибут класса)
    
    def __init__(self, name):
        self.name = name  # 2 отступа (внутри метода)
    
    def speak(self):
        if self.name:  # 2 отступа (внутри метода)
            print(f"{self.name} makes a sound")  # 3 отступа

Try-except:

try:
    risky_operation()  # 1 отступ
except Exception as e:
    handle_error(e)  # 1 отступ
finally:
    cleanup()  # 1 отступ

Правило 4: Многострочные выражения

Когда строка слишком длинная, можно продолжить на следующей строке:

# Способ 1: Продолжение в скобках (рекомендуется)
result = (
    very_long_function_name(
        arg1,
        arg2,
        arg3
    )
)

# Способ 2: Backslash (менее рекомендуется)
result = value1 + \
         value2 + \
         value3

# Способ 3: Implicit line continuation (в списках, dict, кортежах)
my_list = [
    item1,
    item2,
    item3  # Нет запятой после последнего элемента (опционально)
]

my_dict = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3'
}

Правильное выравнивание аргументов:

# ✅ ПРАВИЛЬНО: выравнивание по первому аргументу
result = my_function(
    argument1,
    argument2,
    argument3
)

# ✅ ПРАВИЛЬНО: вешающий отступ (hanging indent)
result = my_function(
        argument1,
        argument2,
        argument3
    )

# ✅ ПРАВИЛЬНО: отступ 8 пробелов (удвоенный)
result = my_function(
        argument1,
        argument2,
        argument3
    )

# ❌ НЕПРАВИЛЬНО: неправильное выравнивание
result = my_function(
    argument1,
        argument2,  # Неправильно выравнено
    argument3
)

Правило 5: List Comprehension и выражения

# ✅ ПРАВИЛЬНО: на одной строке (если коротко)
numbers = [x for x in range(10) if x % 2 == 0]

# ✅ ПРАВИЛЬНО: на нескольких строках (если длинно)
numbers = [
    x * 2
    for x in range(100)
    if x % 2 == 0
    if x < 50
]

# ✅ ПРАВИЛЬНО: многострочный dict comprehension
my_dict = {
    key: value
    for key, value in items.items()
    if value > 0
}

Инструменты для автоматизации отступов

1. IDE Автоматически (Рекомендуется)

В PyCharm, VS Code, Sublime Text отступы ставятся автоматически:

VS Code settings.json:
{
    "[python]": {
        "editor.insertSpaces": true,
        "editor.tabSize": 4,
        "editor.formatOnSave": true
    }
}

2. Black — автоматический форматер

Основной форматер в Python экосистеме:

pip install black
black myfile.py  # Автоматически форматирует
# Конфиг pyproject.toml
[tool.black]
line-length = 88  # Black стандарт
target-version = ['py39']

3. Flake8 — проверка стиля

pip install flake8
flake8 myfile.py  # Проверяет соответствие PEP 8

Ошибки:

myfile.py:5:1: E111 indentation is not a multiple of four
myfile.py:10:1: E101 indentation contains mixed spaces and tabs

4. Pylint — строгий лэнтер

pip install pylint
pylint myfile.py

Частые ошибки

Ошибка 1: Смешивание табуляций и пробелов

# ❌ ОШИБКА
def function():
    if True:  # 4 пробела
	return "Hello"  # Таб вместо пробелов

SyntaxError: inconsistent use of tabs and spaces in indentation

Решение:

# Показать все пробелы/табы в файле
cat -A myfile.py

# Заменить табы на пробелы (используй в своём редакторе)

Ошибка 2: Забыли отступ

# ❌ ОШИБКА
def function():
print("Hello")  # Нет отступа!

IndentationError: expected an indented block

Решение:

# ✅ ПРАВИЛЬНО
def function():
    print("Hello")  # Добавляем 4 пробела

Ошибка 3: Слишком много отступов

# ❌ НЕПРАВИЛЬНО
if True:
        print("Hello")  # 8 пробелов вместо 4

# ✅ ПРАВИЛЬНО
if True:
    print("Hello")  # 4 пробела

Конфигурация для production кода

# pyproject.toml
[tool.black]
line-length = 88
target-version = ['py39', 'py310', 'py311']

[tool.flake8]
max-line-length = 88
ignore = ['E203', 'W503']
exclude = ['.git', '__pycache__', 'venv']

[tool.isort]
profile = "black"
line_length = 88

[tool.pylint]
max-line-length = 88
good-names = ['i', 'j', 'k', 'ex', 'Run', '_']

Quick Reference

Правило              | Пример
─────────────────────┼──────────────────────
1. Используй 4 пробела | def f():\n    pass
2. Не табуляции       | Никогда не используй Tab
3. Последовательны    | Одинаково везде
4. Выравнивание скобок| (\n    arg1,\n    arg2\n)
5. Инструменты        | Black, Flake8, Pylint
Как правильно ставить отступы в Python? | PrepBro