Перейти до змісту

Просунуті типи Python

🌐 Переклад ШІ та людьми

Цей переклад виконано ШІ під керівництвом людей. 🤝

Можливі помилки через неправильне розуміння початкового змісту або неприродні формулювання тощо. 🤖

Ви можете покращити цей переклад, допомігши нам краще спрямовувати AI LLM.

Англійська версія

Ось кілька додаткових ідей, які можуть бути корисні під час роботи з типами в Python.

Використання Union або Optional

Якщо ваш код з якоїсь причини не може використовувати |, наприклад, якщо це не анотація типів, а щось на кшталт response_model=, замість вертикальної риски (|) ви можете використати Union з typing.

Наприклад, ви можете оголосити, що щось може бути str або None:

from typing import Union


def say_hi(name: Union[str, None]):
        print(f"Hi {name}!")

У typing також є скорочення, щоб оголосити, що щось може бути None, - Optional.

Ось порада з моєї дуже «суб'єктивної» точки зору:

  • 🚨 Уникайте використання Optional[SomeType]
  • Натомість ✨ використовуйте Union[SomeType, None] ✨.

Обидва варіанти еквівалентні і під капотом однакові, але я рекомендую Union замість Optional, тому що слово «optional» ніби натякає, що значення є необов'язковим, а насправді означає «може бути None», навіть якщо воно не є необов'язковим і все ще обов'язкове.

Вважаю, Union[SomeType, None] більш явно це передає.

Йдеться лише про слова та назви. Але ці слова можуть впливати на те, як ви та ваша команда думаєте про код.

Як приклад, розгляньмо цю функцію:

from typing import Optional


def say_hi(name: Optional[str]):
    print(f"Hey {name}!")

Параметр name визначено як Optional[str], але він не є необов'язковим, ви не можете викликати функцію без цього параметра:

say_hi()  # О ні, це викликає помилку! 😱

Параметр name все ще обов'язковий (не «необов'язковий»), тому що не має значення за замовчуванням. Водночас name приймає None як значення:

say_hi(name=None)  # Це працює, None припустимий 🎉

Гарна новина: у більшості випадків ви зможете просто використовувати |, щоб визначати об'єднання типів:

def say_hi(name: str | None):
    print(f"Hey {name}!")

Тож зазвичай вам не доведеться перейматися такими назвами, як Optional і Union. 😎