Fix issue with ClassVar parsing (#3403)

* Fix issue with ClassVar parsing

* Fix lint error

* Simplify test

* Fix condition and test
This commit is contained in:
Yurii Karabas
2021-11-19 00:40:15 +02:00
committed by GitHub
parent 8afdaab4ac
commit ee0b2e2153
3 changed files with 21 additions and 1 deletions
+1
View File
@@ -0,0 +1 @@
Fix issue when pydantic fail to parse `typing.ClassVar` string type annotation.
+3 -1
View File
@@ -332,7 +332,9 @@ def resolve_annotations(raw_annotations: Dict[str, Type[Any]], module_name: Opti
annotations = {}
for name, value in raw_annotations.items():
if isinstance(value, str):
if sys.version_info >= (3, 7):
if (3, 10) > sys.version_info >= (3, 9, 8) or sys.version_info >= (3, 10, 1):
value = ForwardRef(value, is_argument=False, is_class=True)
elif sys.version_info >= (3, 7):
value = ForwardRef(value, is_argument=False)
else:
value = ForwardRef(value)
+17
View File
@@ -519,3 +519,20 @@ def test_nested_forward_ref():
NestedTuple.update_forward_refs()
obj = NestedTuple.parse_obj({'x': ('1', {'x': ('2', {'x': ('3', None)})})})
assert obj.dict() == {'x': (1, {'x': (2, {'x': (3, None)})})}
@skip_pre_37
def test_class_var_as_string(create_module):
module = create_module(
# language=Python
"""
from __future__ import annotations
from typing import ClassVar
from pydantic import BaseModel
class Model(BaseModel):
a: ClassVar[int]
"""
)
assert module.Model.__class_vars__ == {'a'}