Freeze mutable values nested inside tuple arguments
This commit is contained in:
parent
5e819525db
commit
32df6504cc
2 changed files with 23 additions and 0 deletions
|
|
@ -68,6 +68,12 @@ def freeze(value: Union[Sequence[Any], Mapping[str, Any], Set[Any], BaseModel])
|
||||||
if isinstance(value, set):
|
if isinstance(value, set):
|
||||||
return FrozenSet(value)
|
return FrozenSet(value)
|
||||||
|
|
||||||
|
if isinstance(value, tuple):
|
||||||
|
values = tuple(freeze(item) for item in value)
|
||||||
|
if hasattr(type(value), "_fields"): # preserve named-tuple argument types
|
||||||
|
return type(value)(*values)
|
||||||
|
return values
|
||||||
|
|
||||||
if isinstance(value, BaseModel):
|
if isinstance(value, BaseModel):
|
||||||
# Keep the already-validated values, aliases, nested types and private
|
# Keep the already-validated values, aliases, nested types and private
|
||||||
# attributes. Reconstructing from model_dump() runs validators again.
|
# attributes. Reconstructing from model_dump() runs validators again.
|
||||||
|
|
|
||||||
17
tests/test_cache_regressions.py
Normal file
17
tests/test_cache_regressions.py
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
from typing import Dict, Tuple
|
||||||
|
|
||||||
|
from great_ai import GreatAI
|
||||||
|
|
||||||
|
|
||||||
|
def test_nested_tuple_inputs_can_be_cached(isolated_context: None) -> None:
|
||||||
|
calls = 0
|
||||||
|
|
||||||
|
@GreatAI.create
|
||||||
|
def predict(value: Tuple[Dict[str, int]]) -> int:
|
||||||
|
nonlocal calls
|
||||||
|
calls += 1
|
||||||
|
return value[0]["x"]
|
||||||
|
|
||||||
|
assert predict(({"x": 7},)).output == 7
|
||||||
|
assert predict(({"x": 7},)).output == 7
|
||||||
|
assert calls == 1
|
||||||
Loading…
Reference in a new issue