- №6 Присвоение типа переменной / Уроки по Python для начинающих
- int(): пример преобразования
- float(): пример преобразования
- str(): пример преобразования
- Объявление типов переменных python
- Аннотация функций
- Использование специальных типов
- Any
- Literal
- Union
- TypedDict
- NoReturn
- Final
- Использование статической проверки типов в Python
- Лучшие практики аннотации типов
- 1. Использование типа Any
- 2. Включите статическую проверку типов
- 3. Используйте кортежи для массивов фиксированной длины
- 4. Типы возврата функций
- Материалы по теме
- Источники
№6 Присвоение типа переменной / Уроки по Python для начинающих
Порой, в работе с Python вам может понадобиться явно указать тип переменной. Это можно сделать с помощью преобразования. Python — объектно-ориентированный язык программирования, в нем используются классы для определения типов данных, включая простые типы.
Преобразование в Python выполняется с использованием функций-конструкторов:
- int() — создает целочисленное число из числового значения, либо значения с плавающей точкой (округляя его до предыдущего целого числа) или строкового значение (при условии, что данная строка является целым числом)
- float() — так же создает число, но с плавающей точкой из целочисленного значения, значения с плавающей точкой или строкового (при условии, что строка представляет собой число с плавающей точкой или целое число)
- str() — создает строку из многих типов данных, включая строки, целые числа и числа с плавающей точкой.
int(): пример преобразования
x = int(1) # x станет 1 y = int(2.8) # y станет 2 z = int("3") # z станет 3
float(): пример преобразования
x = float(1) # x станет 1.0 y = float(2.8) # y станет 2.8 z = float("3") # z станет 3.0 w = float("4.2") # w станет 4.2
str(): пример преобразования
x = str("s1") # x станет 's1' y = str(2) # y станет '2' z = str(3.0) # z станет '3.0'
Объявление типов переменных python
Аннотация функций
Синтаксис аннотации переменных работает и для параметров функций. Однако, чтобы указать тип возврата ( return ), мы добавляем стрелку –> , за которой следует его тип.
from typing import Dict, List def convert_celcius_to_fahrenheit(celcius_temp: float) –> float: return (celcius_temp * 9/5) + 32 def send_email(subject: str, body: str, recipients: List[str], cache: Dict[str, str]) –> bool: # пропущено для краткости return True # или False
Использование специальных типов
Итак, когда мы разогрелись и познакомились с синтаксисом аннотаций типов, давайте познакомимся с более сложными типами.
Any
Переменная типа Any является неограниченной. Поэтому такие переменные совместимы со всеми другими типами ( int , str , List и т. д.), а все остальные типы совместимы с ними.
from typing import Any result: Any = "SUCCESS" # также работает, потому что переменные типа Any совместимы с другими типами result = 10 state: str = "PENDING" # работает, потому что все остальные типы совместимы с типом Any. state = result
Literal
Литералы используются для указания программам проверки типов, что значение, которое имеет переменная или функция, равно одному из указанных значений.
from typing import Literal GENDER = Literal["male", "female", "non–conforming"] def create_user(first_name: str, last_name: str, gender: GENDER) –> dict[str, str, GENDER]: return create_user("John", "Bond", "male")
В вышеприведенном примере пол будет одним из значений литерального объявления GENDER – «мужской», «женский» или «non–conforming».
Union
Иногда переменная может обладать свойствами, охватывающими два объявленных типа. Переменная также может быть двух типов.
from typing import Union def get_room_temperature() –> Union[int, float]: return 20.8 # 20 тоже сработает
TypedDict
Словари, будучи одной из самых простых форм структуры данных в Python, являются одним из наиболее используемых типов переменных в языке.
Использование TypedDict может значительно улучшить читаемость кода, особенно в большом проекте, где много объявлений в разных местах; отслеживание того, что куда идет, становится затруднительным по мере изменения размера проекта.
from typing import TypedDict, Union class Card(TypedDict): rank: Union[str, int] suit: str # класс Card теперь имеет поведение обоих классов TypedDict и dict # Card может быть использован для аннотации переменной ace_of_spade: Card = # или может быть инстанцирован ace_of_spade = Card(rank='A', suit='♤')
NoReturn
Тип NoReturn аналогичен типу void в других языках программирования. Он используется для объявления того, что функция не имеет возврата.
from typing import NoReturn def say_greeting() –> NoReturn: print("Hello World!")
Final
Это конструкция типизации, используемая для указания того, что переменная не должна быть повторно назначена или переопределена в подклассе.
from typing import Final MIN_NAME_LENGTH: Final = 2 # выдаст ошибку, зафиксированную системой проверки типов MIN_NAME_LENGTH += 1 class Validator(object): MIN_NAME_LENGTH: Final[int] = 4 class UserValidator(Validator): # эта строка будет отмечена интерпретатором MIN_NAME_LENGTH = 3
Использование статической проверки типов в Python
Интерпретатор Python по умолчанию не осуществляет проверку типов. Однако была создана версия интерпретатора Python – mypy , которая обеспечивает проверку типов на уровне интерпретатора.
Вы можете использовать mypy двумя способами:
- Загрузить командную строку mypy и использовать ее для запуска ваших скриптов Python.
- Установить расширение mypy , доступное в VSCode и PyCharm.
Лучшие практики аннотации типов
1. Использование типа Any
Тип Any следует использовать только тогда, когда точный тип возвращаемой переменной или параметра функции нам неизвестен; это может быть при использовании сторонней библиотеки, не имеющей аннотаций типов, или при использовании модуля без аннотаций типов.
2. Включите статическую проверку типов
Преимущества проверки типов, заключающиеся в предотвращении ошибок и помощи разработчику, будут не так ощутимы, если она будет динамической. Если вы не любите командную строку mypy , вы также можете установить его как расширение VSCode или PyCharm.
3. Используйте кортежи для массивов фиксированной длины
Кортежи выполняют двойную функцию записи. Поэтому, когда у вас есть известное количество элементов в массиве, особенно когда они не все одного типа, для переменной лучше использовать тип кортеж.
4. Типы возврата функций
Функции должны выполнять одно и только одно действие, поэтому они должны иметь один определенный тип.
В этой статье мы научились:
- Синтаксису аннотации типов, а также аннотации переменных и функций.
- Как использовать сложные конструкции типизации ( Any , Literal , Union , TypedDict , NoReturn , Final ).
- Как можно обеспечить проверку типов на уровне интерпретатора Python.
- Лучшим практикам аннотации типов и как внедрить проверку типов Python в свой проект.