如何验证命名元组值?

ker*_*ran 8 python oop namedtuple python-3.x

我有一个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
Run Code Online (Sandbox Code Playgroud)

我现在的解决方案是没有方法的原始类:

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

        self.app_type = app_type
        self.number = number
Run Code Online (Sandbox Code Playgroud)

它是pythonic吗?是否矫枉过正?

Reb*_*que 9

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

输出:

Version(app=<AppType.desktop: 0>) Version(app=<AppType.web: 1>)
Run Code Online (Sandbox Code Playgroud)

一个 undefinedAppType引发了一个AttributeError

v2 = Version(app=AppType.deskpoop)
Run Code Online (Sandbox Code Playgroud)

输出:

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)
Run Code Online (Sandbox Code Playgroud)