Skip to content

Commit 9e861b8

Browse files
committed
Stick with field_name
1 parent dbcb875 commit 9e861b8

File tree

6 files changed

+133
-181
lines changed

6 files changed

+133
-181
lines changed

python/pydantic_core/core_schema.py

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@
88
import sys
99
from collections.abc import Mapping
1010
from datetime import date, datetime, time, timedelta
11-
from typing import TYPE_CHECKING, Any, Callable, Dict, Generic, Hashable, List, Optional, Set, Type, Union
12-
13-
from typing_extensions import Literal, TypedDict, TypeVar
11+
from typing import TYPE_CHECKING, Any, Callable, Dict, Hashable, List, Optional, Set, Type, Union
1412

1513
if sys.version_info < (3, 11):
1614
from typing_extensions import Protocol, Required, TypeAlias
1715
else:
1816
from typing import Protocol, Required, TypeAlias
1917

18+
if sys.version_info < (3, 9):
19+
from typing_extensions import Literal, TypedDict
20+
else:
21+
from typing import Literal, TypedDict
22+
2023
if TYPE_CHECKING:
2124
from pydantic_core import PydanticUndefined
2225
else:
@@ -163,10 +166,7 @@ def mode(self) -> Literal['python', 'json']:
163166
...
164167

165168

166-
_FieldInfoType = TypeVar('_FieldInfoType', default=Any)
167-
168-
169-
class FieldValidationInfo(ValidationInfo, Protocol[_FieldInfoType]):
169+
class FieldValidationInfo(ValidationInfo, Protocol):
170170
"""
171171
Argument passed to model field validation functions.
172172
"""
@@ -177,9 +177,9 @@ def data(self) -> Dict[str, Any]:
177177
...
178178

179179
@property
180-
def field_info(self) -> _FieldInfoType:
180+
def field_name(self) -> str:
181181
"""
182-
Information on the current field being validated if this validator is
182+
The name of the current field being validated if this validator is
183183
attached to a model field.
184184
"""
185185
...
@@ -1623,13 +1623,13 @@ class GeneralValidatorFunctionSchema(TypedDict):
16231623

16241624

16251625
# (__input_value: Any, __info: FieldValidationInfo) -> Any
1626-
FieldValidatorFunction = Callable[[Any, FieldValidationInfo[_FieldInfoType]], Any]
1626+
FieldValidatorFunction = Callable[[Any, FieldValidationInfo], Any]
16271627

16281628

1629-
class FieldValidatorFunctionSchema(TypedDict, Generic[_FieldInfoType]):
1629+
class FieldValidatorFunctionSchema(TypedDict):
16301630
type: Literal['field']
1631-
function: FieldValidatorFunction[_FieldInfoType]
1632-
field_info: Required[_FieldInfoType]
1631+
function: FieldValidatorFunction
1632+
field_name: str
16331633

16341634

16351635
ValidationFunction = Union[NoInfoValidatorFunctionSchema, FieldValidatorFunctionSchema, GeneralValidatorFunctionSchema]
@@ -1691,10 +1691,10 @@ def fn(v: bytes) -> str:
16911691

16921692

16931693
def field_before_validator_function(
1694-
function: FieldValidatorFunction[_FieldInfoType],
1694+
function: FieldValidatorFunction,
1695+
field_name: str,
16951696
schema: CoreSchema,
16961697
*,
1697-
field_info: _FieldInfoType = None,
16981698
ref: str | None = None,
16991699
metadata: Any = None,
17001700
serialization: SerSchema | None = None,
@@ -1706,13 +1706,13 @@ def field_before_validator_function(
17061706
```py
17071707
from pydantic_core import SchemaValidator, core_schema
17081708
1709-
def fn(v: bytes, info: core_schema.FieldValidationInfo[str]) -> str:
1709+
def fn(v: bytes, info: core_schema.FieldValidationInfo) -> str:
17101710
assert info.data is not None
1711-
assert info.field_info == 'field_name'
1711+
assert info.field_name is not None
17121712
return v.decode() + 'world'
17131713
17141714
func_schema = core_schema.field_before_validator_function(
1715-
function=fn, schema=core_schema.str_schema(), field_info='field_name'
1715+
function=fn, field_name='a', schema=core_schema.str_schema()
17161716
)
17171717
schema = core_schema.typed_dict_schema({'a': core_schema.typed_dict_field(func_schema)})
17181718
@@ -1722,15 +1722,15 @@ def fn(v: bytes, info: core_schema.FieldValidationInfo[str]) -> str:
17221722
17231723
Args:
17241724
function: The validator function to call
1725+
field_name: The name of the field
17251726
schema: The schema to validate the output of the validator function
1726-
field_info: optional metadata describing the field this validator is attached to
17271727
ref: optional unique identifier of the schema, used to reference the schema in other places
17281728
metadata: Any other information you want to include with the schema, not used by pydantic-core
17291729
serialization: Custom serialization schema
17301730
"""
17311731
return _dict_not_none(
17321732
type='function-before',
1733-
function={'type': 'field', 'function': function, 'field_info': field_info},
1733+
function={'type': 'field', 'function': function, 'field_name': field_name},
17341734
schema=schema,
17351735
ref=ref,
17361736
metadata=metadata,
@@ -1828,10 +1828,10 @@ def fn(v: str) -> str:
18281828

18291829

18301830
def field_after_validator_function(
1831-
function: FieldValidatorFunction[_FieldInfoType],
1831+
function: FieldValidatorFunction,
1832+
field_name: str,
18321833
schema: CoreSchema,
18331834
*,
1834-
field_info: _FieldInfoType = None,
18351835
ref: str | None = None,
18361836
metadata: Any = None,
18371837
serialization: SerSchema | None = None,
@@ -1849,7 +1849,7 @@ def fn(v: str, info: core_schema.FieldValidationInfo) -> str:
18491849
return v + 'world'
18501850
18511851
func_schema = core_schema.field_after_validator_function(
1852-
function=fn, schema=core_schema.str_schema()
1852+
function=fn, field_name='a', schema=core_schema.str_schema()
18531853
)
18541854
schema = core_schema.typed_dict_schema({'a': core_schema.typed_dict_field(func_schema)})
18551855
@@ -1859,15 +1859,15 @@ def fn(v: str, info: core_schema.FieldValidationInfo) -> str:
18591859
18601860
Args:
18611861
function: The validator function to call after the schema is validated
1862+
field_name: The name of the field
18621863
schema: The schema to validate before the validator function
1863-
field_info: optional metadata describing the field this validator is attached to
18641864
ref: optional unique identifier of the schema, used to reference the schema in other places
18651865
metadata: Any other information you want to include with the schema, not used by pydantic-core
18661866
serialization: Custom serialization schema
18671867
"""
18681868
return _dict_not_none(
18691869
type='function-after',
1870-
function={'type': 'field', 'function': function, 'field_info': field_info},
1870+
function={'type': 'field', 'function': function, 'field_name': field_name},
18711871
schema=schema,
18721872
ref=ref,
18731873
metadata=metadata,
@@ -1941,13 +1941,13 @@ class GeneralWrapValidatorFunctionSchema(TypedDict):
19411941

19421942

19431943
# (__input_value: Any, __validator: ValidatorFunctionWrapHandler, __info: FieldValidationInfo) -> Any
1944-
FieldWrapValidatorFunction = Callable[[Any, ValidatorFunctionWrapHandler, FieldValidationInfo[_FieldInfoType]], Any]
1944+
FieldWrapValidatorFunction = Callable[[Any, ValidatorFunctionWrapHandler, FieldValidationInfo], Any]
19451945

19461946

1947-
class FieldWrapValidatorFunctionSchema(TypedDict, Generic[_FieldInfoType]):
1947+
class FieldWrapValidatorFunctionSchema(TypedDict):
19481948
type: Literal['field']
1949-
function: FieldWrapValidatorFunction[_FieldInfoType]
1950-
field_info: _FieldInfoType
1949+
function: FieldWrapValidatorFunction
1950+
field_name: str
19511951

19521952

19531953
WrapValidatorFunction = Union[
@@ -2058,10 +2058,10 @@ def fn(
20582058

20592059

20602060
def field_wrap_validator_function(
2061-
function: FieldWrapValidatorFunction[_FieldInfoType],
2061+
function: FieldWrapValidatorFunction,
2062+
field_name: str,
20622063
schema: CoreSchema,
20632064
*,
2064-
field_info: _FieldInfoType = None,
20652065
ref: str | None = None,
20662066
metadata: Any = None,
20672067
serialization: SerSchema | None = None,
@@ -2078,14 +2078,14 @@ def field_wrap_validator_function(
20782078
def fn(
20792079
v: bytes,
20802080
validator: core_schema.ValidatorFunctionWrapHandler,
2081-
info: core_schema.FieldValidationInfo[str],
2081+
info: core_schema.FieldValidationInfo,
20822082
) -> str:
20832083
assert info.data is not None
2084-
assert info.field_info == 'field_name'
2084+
assert info.field_name is not None
20852085
return validator(v) + 'world'
20862086
20872087
func_schema = core_schema.field_wrap_validator_function(
2088-
function=fn, schema=core_schema.str_schema(), field_info='field_name',
2088+
function=fn, field_name='a', schema=core_schema.str_schema()
20892089
)
20902090
schema = core_schema.typed_dict_schema({'a': core_schema.typed_dict_field(func_schema)})
20912091
@@ -2095,15 +2095,15 @@ def fn(
20952095
20962096
Args:
20972097
function: The validator function to call
2098+
field_name: The name of the field
20982099
schema: The schema to validate the output of the validator function
2099-
field_info: optional metadata describing the field this validator is attached to
21002100
ref: optional unique identifier of the schema, used to reference the schema in other places
21012101
metadata: Any other information you want to include with the schema, not used by pydantic-core
21022102
serialization: Custom serialization schema
21032103
"""
21042104
return _dict_not_none(
21052105
type='function-wrap',
2106-
function={'type': 'field', 'function': function, 'field_info': field_info},
2106+
function={'type': 'field', 'function': function, 'field_name': field_name},
21072107
schema=schema,
21082108
ref=ref,
21092109
metadata=metadata,
@@ -2112,8 +2112,8 @@ def fn(
21122112

21132113

21142114
class PlainValidatorFunctionSchema(TypedDict, total=False):
2115-
function: Required[ValidationFunction]
21162115
type: Required[Literal['function-plain']]
2116+
function: Required[ValidationFunction]
21172117
ref: str
21182118
metadata: Any
21192119
serialization: SerSchema
@@ -2194,9 +2194,9 @@ def fn(v: str, info: core_schema.ValidationInfo) -> str:
21942194

21952195

21962196
def field_plain_validator_function(
2197-
function: FieldValidatorFunction[_FieldInfoType],
2197+
function: FieldValidatorFunction,
2198+
field_name: str,
21982199
*,
2199-
field_info: _FieldInfoType = None,
22002200
ref: str | None = None,
22012201
metadata: Any = None,
22022202
serialization: SerSchema | None = None,
@@ -2208,12 +2208,12 @@ def field_plain_validator_function(
22082208
from typing import Any
22092209
from pydantic_core import SchemaValidator, core_schema
22102210
2211-
def fn(v: Any, info: core_schema.FieldValidationInfo[str]) -> str:
2211+
def fn(v: Any, info: core_schema.FieldValidationInfo) -> str:
22122212
assert info.data is not None
2213-
assert info.field_info == 'field_name'
2213+
assert info.field_name is not None
22142214
return str(v) + 'world'
22152215
2216-
func_schema = core_schema.field_plain_validator_function(function=fn, field_info='field_name')
2216+
func_schema = core_schema.field_plain_validator_function(function=fn, field_name='a')
22172217
schema = core_schema.typed_dict_schema({'a': core_schema.typed_dict_field(func_schema)})
22182218
22192219
v = SchemaValidator(schema)
@@ -2222,14 +2222,14 @@ def fn(v: Any, info: core_schema.FieldValidationInfo[str]) -> str:
22222222
22232223
Args:
22242224
function: The validator function to call
2225-
field_info: optional metadata describing the field this validator is attached to
2225+
field_name: The name of the field
22262226
ref: optional unique identifier of the schema, used to reference the schema in other places
22272227
metadata: Any other information you want to include with the schema, not used by pydantic-core
22282228
serialization: Custom serialization schema
22292229
"""
22302230
return _dict_not_none(
22312231
type='function-plain',
2232-
function={'type': 'field', 'function': function, 'field_info': field_info},
2232+
function={'type': 'field', 'function': function, 'field_name': field_name},
22332233
ref=ref,
22342234
metadata=metadata,
22352235
serialization=serialization,

0 commit comments

Comments
 (0)