Skip to content

Commit bd86b83

Browse files
committed
workshopping reuse
1 parent 0ede4d1 commit bd86b83

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

src/validators/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::fmt::Debug;
2+
use std::sync::Arc;
23

34
use enum_dispatch::enum_dispatch;
45
use jiter::{PartialMode, StringCacheMode};
@@ -105,7 +106,7 @@ impl PySome {
105106
#[pyclass(module = "pydantic_core._pydantic_core", frozen)]
106107
#[derive(Debug)]
107108
pub struct SchemaValidator {
108-
validator: CombinedValidator,
109+
validator: Arc<CombinedValidator>,
109110
definitions: Definitions<CombinedValidator>,
110111
// References to the Python schema and config objects are saved to enable
111112
// reconstructing the object for cloudpickle support (see `__reduce__`).
@@ -146,7 +147,7 @@ impl SchemaValidator {
146147
.get_as(intern!(py, "cache_strings"))?
147148
.unwrap_or(StringCacheMode::All);
148149
Ok(Self {
149-
validator,
150+
validator: Arc::new(validator),
150151
definitions,
151152
py_schema,
152153
py_config,
@@ -455,7 +456,7 @@ impl<'py> SelfValidator<'py> {
455456
};
456457
let definitions = definitions_builder.finish()?;
457458
Ok(SchemaValidator {
458-
validator,
459+
validator: Arc::new(validator),
459460
definitions,
460461
py_schema: py.None(),
461462
py_config: None,

src/validators/model.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::ptr::null_mut;
2+
use std::sync::Arc;
23

34
use pyo3::exceptions::PyTypeError;
45
use pyo3::types::{PyDict, PySet, PyString, PyTuple, PyType};
@@ -8,7 +9,7 @@ use pyo3::{intern, prelude::*};
89
use super::function::convert_err;
910
use super::validation_state::Exactness;
1011
use super::{
11-
build_validator, BuildValidator, CombinedValidator, DefinitionsBuilder, Extra, ValidationState, Validator,
12+
build_validator, BuildValidator, CombinedValidator, DefinitionsBuilder, Extra, ValidationState, Validator, SchemaValidator
1213
};
1314
use crate::build_tools::py_schema_err;
1415
use crate::build_tools::schema_or_config_same;
@@ -53,7 +54,7 @@ impl Revalidate {
5354
#[derive(Debug)]
5455
pub struct ModelValidator {
5556
revalidate: Revalidate,
56-
validator: Box<CombinedValidator>,
57+
validator: Arc<CombinedValidator>,
5758
class: Py<PyType>,
5859
generic_origin: Option<Py<PyType>>,
5960
post_init: Option<Py<PyString>>,
@@ -79,7 +80,18 @@ impl BuildValidator for ModelValidator {
7980
let class: Bound<'_, PyType> = schema.get_as_req(intern!(py, "cls"))?;
8081
let generic_origin: Option<Bound<'_, PyType>> = schema.get_as(intern!(py, "generic_origin"))?;
8182
let sub_schema = schema.get_as_req(intern!(py, "schema"))?;
82-
let validator = build_validator(&sub_schema, config.as_ref(), definitions)?;
83+
84+
let validator = if class.getattr("__pydantic_complete__")?.extract::<bool>()? {
85+
if let Ok(prebuilt_validator) = class.getattr("__pydantic_validator__") {
86+
let schema_validator: PyRef<SchemaValidator> = prebuilt_validator.extract()?;
87+
schema_validator.validator.clone()
88+
} else {
89+
Arc::new(build_validator(&sub_schema, config.as_ref(), definitions)?)
90+
}
91+
} else {
92+
Arc::new(build_validator(&sub_schema, config.as_ref(), definitions)?)
93+
};
94+
8395
let name = class.getattr(intern!(py, "__name__"))?.extract()?;
8496

8597
Ok(Self {
@@ -93,7 +105,7 @@ impl BuildValidator for ModelValidator {
93105
.map(|s| s.to_str())
94106
.transpose()?,
95107
)?,
96-
validator: Box::new(validator),
108+
validator,
97109
class: class.into(),
98110
generic_origin: generic_origin.map(std::convert::Into::into),
99111
post_init: schema.get_as(intern!(py, "post_init"))?,

0 commit comments

Comments
 (0)