Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace dict.get and dict.setdefault with more verbose versions in CoreSchema building hot paths #7536

Merged
merged 1 commit into from Sep 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 4 additions & 1 deletion pydantic/_internal/_core_utils.py
Expand Up @@ -558,7 +558,10 @@ def inline_refs(s: core_schema.CoreSchema, recurse: Recurse) -> core_schema.Core

if definitions:
schema = core_schema.definitions_schema(schema=schema, definitions=definitions)
schema.setdefault('metadata', {})[_DEFINITIONS_CACHE_METADATA_KEY] = definitions_cache # type: ignore
if 'metadata' in schema:
schema['metadata'][_DEFINITIONS_CACHE_METADATA_KEY] = definitions_cache
else:
schema['metadata'] = {_DEFINITIONS_CACHE_METADATA_KEY: definitions_cache}
return schema


Expand Down
13 changes: 7 additions & 6 deletions pydantic/_internal/_discriminated_union.py
Expand Up @@ -41,12 +41,13 @@ def inner(s: core_schema.CoreSchema, recurse: _core_utils.Recurse) -> core_schem
if s['type'] == 'tagged-union':
return s

metadata = s.get('metadata', {})
discriminator = metadata.get(CORE_SCHEMA_METADATA_DISCRIMINATOR_PLACEHOLDER_KEY, None)
if discriminator is not None:
if definitions is None:
definitions = collect_definitions(schema)
s = apply_discriminator(s, discriminator, definitions)
metadata = s.get('metadata', None)
if metadata is not None:
discriminator = metadata.get(CORE_SCHEMA_METADATA_DISCRIMINATOR_PLACEHOLDER_KEY, None)
if discriminator is not None:
if definitions is None:
definitions = collect_definitions(schema)
s = apply_discriminator(s, discriminator, definitions)
return s

return _core_utils.walk_core_schema(schema, inner)
Expand Down
12 changes: 8 additions & 4 deletions pydantic/_internal/_generate_schema.py
Expand Up @@ -370,7 +370,10 @@ def _apply_discriminator_to_union(self, schema: CoreSchema, discriminator: Any)
schema,
discriminator,
)
schema.setdefault('metadata', {})[NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY] = True
if 'metadata' in schema:
schema['metadata'][NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY] = True
else:
schema['metadata'] = {NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY: True}
self._needs_apply_discriminated_union = True
return schema

Expand Down Expand Up @@ -644,9 +647,10 @@ def _get_first_two_args_or_any(self, obj: Any) -> tuple[Any, Any]:
return args[0], args[1]

def _post_process_generated_schema(self, schema: core_schema.CoreSchema) -> core_schema.CoreSchema:
schema.setdefault('metadata', {})[
NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY
] = self._needs_apply_discriminated_union
if 'metadata' in schema:
schema['metadata'][NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY] = self._needs_apply_discriminated_union
else:
schema['metadata'] = {NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY: self._needs_apply_discriminated_union}
return schema

def _generate_schema(self, obj: Any) -> core_schema.CoreSchema:
Expand Down
9 changes: 8 additions & 1 deletion pydantic/_internal/_known_annotated_metadata.py
Expand Up @@ -93,7 +93,14 @@ def update_js_schema(s: cs.CoreSchema, handler: GetJsonSchemaHandler) -> dict[st
js_schema.update(f())
return js_schema

s.setdefault('metadata', {}).setdefault('pydantic_js_functions', []).append(update_js_schema)
if 'metadata' in s:
metadata = s['metadata']
if 'pydantic_js_functions' in s:
metadata['pydantic_js_functions'].append(update_js_schema)
else:
metadata['pydantic_js_functions'] = [update_js_schema]
else:
s['metadata'] = {'pydantic_js_functions': [update_js_schema]}


def as_jsonable_value(v: Any) -> Any:
Expand Down