<p>适用于Python3.8(typing.Literal):</p>
<pre class="lang-py prettyprint-override"><code>from dataclasses import dataclass
from typing import Literal
from validated_dc import ValidatedDC
@dataclass
class Person(ValidatedDC):
name: Literal['Eric', 'John', 'Graham', 'Terry'] = 'Eric'
# Validation during instance creation
eric = Person()
assert eric.name == 'Eric'
assert eric.get_errors() is None
john = Person('John')
assert john.get_errors() is None
peter = Person('Peter') # < Invalid value!
assert peter.get_errors()
print(peter.get_errors())
# {'name': [
# LiteralValidationError(
# literal_repr='Peter', literal_type=<class 'str'>,
# annotation=typing.Literal['Eric', 'John', 'Graham', 'Terry']
# )
# ]}
# You can check at any time
assert john.is_valid() # Starts validation and returns True or False
john.name = 'Ivan' # < Invalid value!
assert not john.is_valid()
print(john.get_errors())
# {'name': [
# LiteralValidationError(
# literal_repr='Ivan', literal_type=<class 'str'>,
# annotation=typing.Literal['Eric', 'John', 'Graham', 'Terry']
# )
# ]}
john.name = 'John' # < Valid value
assert john.is_valid()
assert john.get_errors() is None
</code></pre>
<p>ValidatedDC:<a href="https://github.com/EvgeniyBurdin/validated_dc" rel="nofollow noreferrer">https://github.com/EvgeniyBurdin/validated_dc</a></p>