Подсказки типов и проверка типов в Python (49/100 дней Python)

RedDeveloper
19.02.2023 13:32
Подсказки типов и проверка типов в Python (49/100 дней Python)

Python - динамически типизированный язык, что означает, что тип переменной определяется во время выполнения, а не во время объявления. Это может придать некоторую гибкость вашему коду, но также поднимает некоторые вопросы о том, как лучше работать с типами более надежным и эффективным способом.

Подсказки типов для переменных

Чтобы объявить тип переменной в Python, просто добавьте двоеточие, за которым следует тип, после имени переменной:

name: str = 'John Doe'
age: int = 30

Таким образом, если вы попытаетесь присвоить переменной значение другого типа, Python подскажет вам, что ожидался другой тип, сообщением типа Ожидался тип 'str', вместо него получен 'int'.

Подсказки типов для переменных необязательны, но они могут улучшить читаемость и сопровождаемость вашего кода.

Подсказки типов для функций

Синтаксис подсказок типов в функциях аналогичен синтаксису переменных, но подсказки типов необходимо включать в сигнатуру функции:

def repeat_message(message: str, times: int) -> str:
    return message * times

Здесь параметр message объявлен как тип str, а параметр times - как тип int. Тип возврата функции объявлен как str с помощью символа ->.

Подсказки типов для функций необязательны, но они могут облегчить понимание вашего кода, особенно при работе над большими проектами с большим количеством участников.

Подсказки типов для классов

Подсказки типов также можно использовать в классах, в том числе для переменных и методов класса:

class Person:
    name: str
    age: int

    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def say_hello(self) -> None:
        print(f'Hello, my name is {self.name}')

В этом примере переменные класса name и age объявлены с подсказками типа, а метод __init__ принимает параметры с подсказками типа. Метод say_hello также имеет подсказку типа возврата None. Это означает, что он ничего не возвращает. Подсказки типов для классов могут улучшить понимание кода и выявить ошибки на ранней стадии разработки.

Использование общих типов

Помимо основных типов, таких как str, int и float, вы также можете использовать общие типы в подсказках типов. Например, вы можете использовать список ints:

def sum_list(numbers: list[int]) -> int:
    return sum(numbers)


def count_words(words: list[str]) -> dict[str, int]:
    word_counts = {}
    for word in words:
        if word in word_counts:
            word_counts[word] += 1
        else:
            word_counts[word] = 1
    return word_counts

В этом примере функция sum_list принимает в качестве аргумента список[int] и возвращает int. Функция count_words принимает список[str] и возвращает dict[str, int], отображая слова на их частоту в списке.

Работа с модулем типизации

Модуль типизации предоставляет ряд дополнительных подсказок типов, которые могут быть полезны в различных ситуациях. Например, вы можете использовать Union, чтобы указать, что параметр может принимать значения нескольких типов:

from typing import Union

def add(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
    return a + b

Однако в последних версиях Python лучшей альтернативой использованию типа Union является использование типа or oeprator |:

def add(a: int | float, b: int | float) -> int | float:
    return a + b

Функция d принимает два параметра, a и b, которые могут быть значениями int или float. Возвращаемое значение также может быть либо int, либо float.

Вы также можете использовать Optional, чтобы указать, что параметр является необязательным и может быть None:

from typing import Optional

def say_hello(name: str, age: Optional[int] = None) -> None:
    print(f'Hello, my name is {name}')
    if age is not None:
        print(f'I am {age} years old')

Аналогично, вы можете использовать оператор or | для указания того, что переменная также может быть None:В этом примере ad

def say_hello(name: str, age: int | None = None) -> None:
    print(f'Hello, my name is {name}')
    if age is not None:
        print(f'I am {age} years old')

В этом примере параметр age объявлен как тип int или None, что означает, что он может быть либо int, либо None. Значение по умолчанию - None, поэтому параметр необязателен.

Что дальше?

  • Практика: Курс по Python
  • Полная серия: 100 дней Python
  • Предыдущая тема: Множественное наследование в Python
  • Следующая тема: Скоро будет...
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.