⚖️ Старый и современный подход

⚡ Различия в двух словах

Старый: строковые пути, %-форматирование, открытие файлов без encoding, неявные типы.

Новый: pathlib, f-строки, аннотации типов, явный encoding="utf-8".

Вывод: современный код короче, читаемее и меньше зависит от платформы.

📜 Работа с файлами

# Старый подход
with open("grades.json", "r") as file:
    data = json.load(file)

with open("report.json", "w") as file:
    json.dump(data, file, indent=4)

Что здесь происходит: не указан encoding, поэтому на Windows может использоваться cp1252, а на Linux — utf-8. Это приводит к ошибкам с кириллицей.

✅ Современный вариант

from pathlib import Path

grades_path = Path("grades.json")
data = json.loads(grades_path.read_text(encoding="utf-8"))

report_path = Path("report.json")
report_path.write_text(
    json.dumps(data, indent=4, ensure_ascii=False),
    encoding="utf-8",
)

Что улучшилось: путь — объект, а не строка; кодировка явная; отсутствие необходимости вручную открывать и закрывать файл.

📜 Форматирование строк

# Старый подход
print("Номер: %s, длина: %d" % (number, length))
print("Номер: {}, длина: {}".format(number, length))

✅ Современный вариант

print(f"Номер: {number}, длина: {length}")
Преимущества f-строк:
  • Читаемее и компактнее.
  • Быстрее выполняются, чем % и .format.
  • Поддерживают произвольные выражения внутри фигурных скобок.

📜 Типы данных

# Старый подход
def get_quarter(date_str):
    month = datetime.strptime(date_str, "%d-%m-%Y").month
    ...

✅ Современный вариант

from datetime import datetime

def get_quarter(date_str: str) -> str | None:
    month = datetime.strptime(date_str, "%d-%m-%Y").month
    ...

Что улучшилось: аннотации типов помогают редактору подсказывать ошибки и делают контракт функции очевидным.

🕰️ Когда старый подход ещё можно встретить

Legacy-код, учебные материалы и некоторые скрипты могут использовать старый стиль. Это нормально, но в новых проектах рекомендуется применять современные практики. Главное — сохранять совместимость с Python 3.10+, так как оператор | для типов появился в Python 3.10.