Как проверить значения namedtuple? - PullRequest
4 голосов
/ 26 июня 2019

У меня была переменная namedtuple, которая представляет версию приложения (ее номер и тип). Но я хочу и некоторые ограничения на значения:

Version = namedtuple("Version", ["app_type", "number"])
version = Version("desktop") # i want only "desktop" and "web" are valid app types
version = Version("deskpop") # i want to protect from such mistakes

Мое решение на данный момент - примитивный класс без методов:

class Version:
    def __init__(self, app_type, number):
        assert app_type in ('desktop', 'web')

        self.app_type = app_type
        self.number = number

Это питон? Это излишне?

1 Ответ

4 голосов
/ 27 июня 2019

Вы можете использовать enum.Enum и typing.NamedTuple вместо collections.namedtuple:

Может быть что-то вроде этого:

from typing import NamedTuple
import enum

class AppType(enum.Enum):
    desktop = 0
    web = 1

class Version(NamedTuple):
    app: AppType


v0 = Version(app=AppType.desktop)
v1 = Version(app=AppType.web)

print(v0, v1)

output:

Version(app=<AppType.desktop: 0>) Version(app=<AppType.web: 1>)

Неопределенный AppType повышает AttributeError:

v2 = Version(app=AppType.deskpoop)

выход:

AttributeError: deskpoop
...