擅长:python、mysql、java
<p>python 3.8引入了一个名为<code>Literal</code>的新类型,可在此处使用:</p>
<pre class="lang-py prettyprint-override"><code>from dataclasses import dataclass
from typing import Literal
@dataclass
class Person:
name: Literal['Eric', 'John', 'Graham', 'Terry'] = 'Eric'
</code></pre>
<p>像<code>mypy</code>这样的类型检查器在正确解释它时没有问题,<code>Person('John')</code>获得一个通过,并且<code>Person('Marc')</code>被标记为不兼容。请注意,这种提示<em>需要</em>类型检查器才能发挥作用,当您运行代码时,它本身不会做任何事情</p>
<p>如果您使用的是较旧的python版本,并且无法升级到3.8,那么还可以通过正式的pip可安装的backport包<a href="https://pypi.org/project/typing-extensions/" rel="noreferrer">^{<cd6>}</a>访问<code>Literal</code>类型,并使用<code>from typing_extensions import Literal</code>导入它</p>
<hr/>
<P>如果您需要在运行时对传递的值进行实际检查,则应该考虑使用<a href="https://pydantic-docs.helpmanual.io/" rel="noreferrer">^{<cd8>}</a>来定义数据控件。它的主要目标是使用一个强大的验证引擎来扩展类似数据类的结构,该引擎将检查类型提示以强制执行它们,即您认为在<code>__post_init__</code>中手工编写的内容</p>