Как получить хорошие типы из `dataclass` Python без создания экземпляра классаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как получить хорошие типы из `dataclass` Python без создания экземпляра класса

Сообщение Anonymous »

Предположим, у меня есть следующий класс:

Код: Выделить всё

from dataclasses import dataclass
from typing import Annotated

@dataclass
class Pizza:
price: Annotated[float, "money"]
size: Annotated[float, "dimension"]

@dataclass
class Topping:
sauce: Annotated[str, "matter"]
Очевидно, это классы данных (т. е. для хранения данных другими словами), но я бы хотел использовать их и для подсказки типов. Например, было бы довольно просто написать такие функции:

Код: Выделить всё

def bake_pizza(pizza: Pizza) -> Pizza:
some_operation
return new_pizza

def check_if_vegetarian(topping: Pizza.Topping) -> bool:
some_operation
return True
И сравнение типов, например, isinstance будет работать без проблем.
Теперь моя проблема в том, что если я использую атрибуты, я, очевидно, не смогу сделать то же самое, поэтому, например, я не могу написать функция типа:

Код: Выделить всё

def calculate_cost(cost: Pizza.price) -> float:
some_calculation
return cost
потому что цена — это атрибут, а не класс. Я знаю, что вместо этого я мог бы написать:

Код: Выделить всё

def calculate_cost(cost: Pizza.__annotations__["price"]) -> float:
some_calculation
return cost
Тогда я получу то, что хочу, но для нас это небольшая проблема: в зависимости от того, атрибут это или класс, обозначения сильно различаются. До сих пор единственной возможностью сделать это без необходимости различать атрибуты и классы было использование строк, например «Pizza.Topping» или «Pizza.price», но я не уверен, насколько чист этот метод. У кого-нибудь есть идея получше?


Подробнее здесь: https://stackoverflow.com/questions/790 ... -the-class
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»