Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как правильно ставить отступы в 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