Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Типизация в Python: гайд

Мария Богомаз
Мария Богомаз
Технический писатель
16 октября 2023 г.
2810
8 минут чтения
Средний рейтинг статьи: 5

Язык программирования Python выделяется среди наиболее используемых в мире языков программирования своей простотой и удобством. Подобно C, С#, Java и другим, Python относится к типизированным языкам. Типизация языка помогает разработчику создавать более надежные, удобные программы, обеспечивает улучшенную оптимизацию, производительность и безопасность кода. 

Каждый типизированный язык создавался для конкретных целей, поэтому языки программирования стали отличаться по своим методам типизации. Типизация в Python является динамической и строгой. 

Динамическая типизация Python

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

x = 7
x = “Timeweb Cloud”
x = [1, 2, 3]

В данном примере переменная x инициализируется, как целое число (int), затем переопределяется как строка (str) и после как список (list). 

Строгая типизация Python

Строгая типизация обеспечивается соблюдением необходимых правил при взаимодействии с разными типами данных. Операции между разными видами данных обычно запрещены или требуют явного приведения типов. 

x = 7
y = “Timeweb Cloud”

result = x + y

В данном примере переменная x имеет тип данных int, а переменная ystr. Попытка выполнить сложение между переменными разных типов приведет к ошибке ‘TypeError’, так как Python следит за соблюдением правил типизации. 

x = 7
y = 3.14

result = x + y

В данном примере при сложении целого числа x (int) и числа с плавающей точкой y (float) Python автоматически приведет x к типу float и выполнит сложение. 

Хотя Python и является строго типизированным языком, он обладает гибкостью динамической типизации, что позволяет разработчику преобразовывать типы данных, используя функции приведении типов (int(), float() и др.) 

Типы данных Python

Для определения типов переменных в Python используются встроенные типы данных: 

  • int — используется для представления целых чисел, как положительных, так и отрицательных;
  • float — числа, которые могут иметь десятичную часть;
  • str — текстовая информация (строки);
  • bool — булевы значения: True, False;
  • list — изменяемые упорядоченные коллекции элементов (списки);
  • tuple — неизменяемые упорядоченные коллекции элементов (кортежи);
  • dict — пары «ключ-значение», где каждый ключ является уникальным (словари);
  • bytes — байтовые последовательности, используются для работы с бинарными файлами;
  • и др.

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

Тип данных

x = -10

int

pi = 3.14

float

name = “Anna”

str

fruits = [“apple”, “banana”, “orange”]

list

coordinates = (3, 4)

tuple

Каждый из перечисленных видов данных обладает своими характеристиками, в Python представлено множество встроенных типов данных, но разработчик может создавать свои собственные — при помощи ключевого слова class. Типизация классов Python обеспечивается с помощью аннотаций типов. 

Аннотации типов данных

Аннотации типов предоставляют разработчику возможность указать ожидаемый тип данных переменной, аргумента функции или возвращаемого значения функции. Они улучшают читаемость кода, но при этом не оказывают влияния на выполнение программы. Обычно аннотации типов указываются после имени переменной, аргумента или функции, разделяя имя и тип данных двоеточием.

class Employee:
    def __init__(self, employee_id: str, salary: float):
        self.employee_id: str = employee_id
      self.salary: float = salary

В приведенном примере аннотации типов атрибутов класса указывают, что employee_id ожидается быть строкой, а salary — числом с плавающей запятой. 

class Circle:
    def __init__(self, radius: float):
        self.radius: float = radius

    def area(self) -> float:
        return 3.14159 * self.radius**2

Аннотации типов можно применять и к методам класса. В этом примере аргументы и возвращаемое значение аннотированы как float

Также аннотации типов можно использовать для типизации функций Python. В функциях можно аннотировать аргументы функций, их возвращаемые значения, декораторы функции и т.д. 

def find_max(numbers: List[int]) -> int:
    if not numbers:
        raise ValueError(“Список пуст”)
    max_value: int = numbers[0]
    for num in numbers:
        if num > max_value:
            max_value = num
    return max_value

В примере продемонстрирована функция, принимающая список с аннотацией типа int и возвращающая наибольшее целое число из списка с аннотацией типа int

Модуль typing

Помимо аннотации типов для типизации языка Python используется встроенный модуль typing, который предоставляет разработчику дополнительные средства для более точной и продвинутой типизации. Рассмотрим некоторые структуры данных из модуля typing

  • Any — представляет неопределенный тип, используется, когда точно неизвестен тип переменной;
  • Union — позволяет указать несколько возможных типов для переменной;
  • Optional — указывает, что переменная может иметь значение определенного типа или быть None.
from typing import Union, Optional, Any

def process_data(data: Union[int, str, float, None]) -> Optional[Any]:
    if data is None:
        return None
    if isinstance(data, int):
        return f"Processed integer: {data * 2}"
    if isinstance(data, str):
        return f"Processed string: {data.upper()}"
    if isinstance(data, float):
        return f"Processed float: {round(data, 2)}"

# Примеры использования
print(process_data(42))
print(process_data("hello"))
print(process_data(3.1415926535))
print(process_data(None))

Функция process_data принимает аргумент data, который может быть целым числом, строкой, числом с плавающей точкой или None. Функция возвращает либо обработанное значение, либо None. Например, если data является целым числом, оно умножается на 2 и возвращается в виде строки с сообщением о том, что это обработанная строка. 

  • TypeVar — позволяет создавать параметризованные типы;
  • Generic — позволяет создавать обобщенные классы и функции.
from typing import TypeVar, Generic

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, item: T):
        self.item = item

    def get_item(self) -> T:
        return self.item

# Пример использования
string_box = Box("Hello, World!")
int_box = Box(42)

# Получаем элементы из контейнеров
string_value: str = string_box.get_item()
int_value: int = int_box.get_item()

print("String Box Value:", string_value)
print("Int Box Value:", int_value)

В приведенном примере создается обобщенный класс Box, который может содержать объекты любого типа. TypeVar используется для создания обобщенного типа переменной T, который затем используется в качестве типа аргумента класса Box. Класс Box принимает и возвращает элементы указанного типа. В примере используются контейнеры с разными типами данных: строкой и целым числом. 

Инструменты проверки типов

Использование аннотаций данных и модуля typing улучшает читаемость кода и помогает инструментам статической проверки обнаруживать потенциальные ошибки в типизации данных на ранних стадиях разработки. Рассмотрим некоторые популярные инструменты проверки типов: 

  • Mypy позволяет добавлять аннотации данных к коду и проверять их на корректность, выявляя потенциальные ошибки типизации. Mypy поддерживает различные сторонние библиотеки и фреймворки, включая NumPy, Django и другие. 
  • Pyright, разработанный для поддержки типизации в Python через использование аннотаций данных, а также комментариев к типам. Pyright интегрируется непосредственно в Visual Studio Code и предоставляет подсказки и автодополнение структуры данных в реальном времени.
  • PyCharm — это интегрированная среда разработки (IDE) для Python, которая включает в себя встроенную поддержку аннотаций типов и статической проверки структуры данных. PyCharm предоставляет множество инструментов для улучшения типизации кода, включая быстрые исправления и автоматическую генерацию аннотаций типов.
  • Существует также ряд других инструментов и IDE, которые представляют возможности статической проверки структуры данных и поддерживают аннотации типов.

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

Заключение

Типизация в Python является важным аспектом при разработке программного кода. Для эффективной работы разработчик должен учитывать строгую динамическую типизацию Python, использовать аннотации типов и модуль typing, помнить о возможности создания собственных пользовательских структур данных и не пренебрегать инструментами проверки. Важно понимать, что типизация — это инструмент для улучшения качества кода, и не всегда необходимо стремиться к абсолютной статической типизации, увлекаясь излишней сложностью.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону