键入:限制为字符串列表

Chr*_*uer 4 python python-dataclasses python-typing

这是 Python 3.7

我有一个这样的数据类:

@dataclass
class Action:
   action: str
Run Code Online (Sandbox Code Playgroud)

但 action 实际上仅限于值“bla”和“foo”。有没有一种明智的方式来表达这一点?

Tup*_*teq 5

typing.Literal像这样使用:

@dataclass
class Action:
   action: Literal["bla", "foo"]
Run Code Online (Sandbox Code Playgroud)

问题是它是 Python 3.8 中的新功能。如果你想要Literal在早期的 Python 版本中,你需要安装typing-extensions模块。因此,Python 3.7 的完整解决方案如下所示:

from dataclasses import dataclass
from typing_extensions import Literal

@dataclass
class Action:
   action: Literal["bla", "foo"]
Run Code Online (Sandbox Code Playgroud)

  • 您可以在 3.7 中从 pip 安装 [typing-extension](https://pypi.org/project/typing-extensions/)。它是“Literal”等功能向早期版本的官方向后移植。 (2认同)
  • @Arne,伟大的发现。我会将其添加到我的答案中:) (2认同)

sch*_*ggl 5

你可以使用一个Enum

from dataclasses import dataclass
from enum import Enum

class ActionType(Enum):
    BLA = 'bla'
    FOO = 'foo'

@dataclass
class Action:
    action: ActionType

>>> a = Action(action=ActionType.FOO)
>>> a.action.name
'FOO'
>>> a.action.value
'foo'
Run Code Online (Sandbox Code Playgroud)