You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Discriminated union type breaks from 2.6.3 to 2.6.4: TypeError: 'none' is not a valid discriminated union variant; should be a BaseModel or dataclass#9118
Closed
1 task done
mcleantom opened this issue
Mar 27, 2024
· 5 comments
· Fixed by #9124
I have some pydantic models that I am using to make configurable models based on conditions, they are quite complicated being self-referencing and generic. My code works in 2.6.3 but breaks in 2.6.4.
In 2.6.4 I get the error:
File "C:\Users\tom.mclean\AppData\Roaming\JetBrains\PyCharmCE2023.3\scratches\scratch_6.py", line 102, in <module>
BooCondition = create_conditions_type(Foo)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Roaming\JetBrains\PyCharmCE2023.3\scratches\scratch_6.py", line 87, in create_conditions_type
AndCondition[return_value_type],
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\main.py", line 687, in __class_getitem__
submodel = _generics.create_generic_submodel(model_name, origin, args, params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generics.py", line 138, in create_generic_submodel
created_model = meta(
^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_model_construction.py", line 178, in __new__
set_model_fields(cls, bases, config_wrapper, types_namespace)
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_model_construction.py", line 452, in set_model_fields
fields, class_vars = collect_model_fields(cls, bases, config_wrapper, types_namespace, typevars_map=typevars_map)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_fields.py", line 232, in collect_model_fields
field.apply_typevars_map(typevars_map, types_namespace)
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\fields.py", line 556, in apply_typevars_map
self.annotation = _generics.replace_types(annotation, typevars_map)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generics.py", line 290, in replace_types
resolved_type_args = tuple(replace_types(arg, type_map) for arg in type_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generics.py", line 290, in <genexpr>
resolved_type_args = tuple(replace_types(arg, type_map) for arg in type_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generics.py", line 282, in replace_types
annotated = replace_types(annotated_type, type_map)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generics.py", line 290, in replace_types
resolved_type_args = tuple(replace_types(arg, type_map) for arg in type_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generics.py", line 290, in <genexpr>
resolved_type_args = tuple(replace_types(arg, type_map) for arg in type_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generics.py", line 323, in replace_types
return type_[resolved_type_args]
~~~~~^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\main.py", line 687, in __class_getitem__
submodel = _generics.create_generic_submodel(model_name, origin, args, params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generics.py", line 138, in create_generic_submodel
created_model = meta(
^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_model_construction.py", line 183, in __new__
complete_model_class(
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_model_construction.py", line 527, in complete_model_class
schema = gen_schema.clean_schema(schema)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_generate_schema.py", line 427, in clean_schema
schema = _discriminated_union.apply_discriminators(schema)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 56, in apply_discriminators
return simplify_schema_references(_core_utils.walk_core_schema(schema, inner))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 416, in walk_core_schema
return f(schema.copy(), _dispatch)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 44, in inner
s = recurse(s, inner)
^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 199, in walk
return f(schema, self._walk)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 44, in inner
s = recurse(s, inner)
^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 202, in _walk
schema = self._schema_type_to_method[schema['type']](schema.copy(), f)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 234, in handle_definitions_schema
updated_definition = self.walk(definition, f)
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 199, in walk
return f(schema, self._walk)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 44, in inner
s = recurse(s, inner)
^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 202, in _walk
schema = self._schema_type_to_method[schema['type']](schema.copy(), f)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 211, in _handle_other_schemas
schema['schema'] = self.walk(sub_schema, f) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 199, in walk
return f(schema, self._walk)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 44, in inner
s = recurse(s, inner)
^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 202, in _walk
schema = self._schema_type_to_method[schema['type']](schema.copy(), f)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 339, in handle_model_fields_schema
replaced_field['schema'] = self.walk(v['schema'], f)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 199, in walk
return f(schema, self._walk)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 44, in inner
s = recurse(s, inner)
^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 202, in _walk
schema = self._schema_type_to_method[schema['type']](schema.copy(), f)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 254, in handle_list_schema
schema['items_schema'] = self.walk(items_schema, f)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_core_utils.py", line 199, in walk
return f(schema, self._walk)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 53, in inner
s = apply_discriminator(s, discriminator, definitions)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 95, in apply_discriminator
return _ApplyInferredDiscriminator(discriminator, definitions or {}).apply(schema)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 190, in apply
schema = self._apply_to_root(schema)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 230, in _apply_to_root
self._handle_choice(choice)
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 305, in _handle_choice
inferred_discriminator_values = self._infer_discriminator_values_for_choice(choice, source_name=None)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 384, in _infer_discriminator_values_for_choice
return self._infer_discriminator_values_for_choice(self.definitions[schema_ref], source_name=source_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\tom.mclean\AppData\Local\miniconda3\envs\Module\Lib\site-packages\pydantic\_internal\_discriminated_union.py", line 386, in _infer_discriminator_values_for_choice
raise TypeError(
TypeError: 'none' is not a valid discriminated union variant; should be a `BaseModel` or `dataclass`
from __future__ importannotationsfromtypingimportAnnotated, Literal, List, Union, TypeVar, GenericfrompydanticimportBaseModel, Field, TypeAdapterT=TypeVar('T')
classDog(BaseModel, Generic[T]):
type_: Literal['dog']
friends: List[GenericPet]
id: TclassCat(BaseModel, Generic[T]):
type_: Literal['cat']
friends: List[GenericPet]
id: TGenericPet=Annotated[Union[Dog[T], Cat[T]], Field(..., discriminator='type_')]
ta=TypeAdapter(Dog[int])
#> TypeError: 'none' is not a valid discriminated union variant; should be a `BaseModel` or `dataclass`
Initial Checks
Description
I have some pydantic models that I am using to make configurable models based on conditions, they are quite complicated being self-referencing and generic. My code works in 2.6.3 but breaks in 2.6.4.
In 2.6.4 I get the error:
Example Code
Python, Pydantic & OS Version
The text was updated successfully, but these errors were encountered: