Skip to content

Commit

Permalink
Replace dict.get and dict.setdefault with more verbose versions in Co…
Browse files Browse the repository at this point in the history
…reSchema building hot paths (#7536)
  • Loading branch information
adriangb committed Sep 21, 2023
1 parent ea7bf54 commit 198c8c6
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 12 deletions.
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

0 comments on commit 198c8c6

Please sign in to comment.