Skip to content

Commit 345ca16

Browse files
committed
Keep introspection defaults constructor-owned
Stop treating dataclass and object instance current values as signature defaults. Dataclass instance analysis now reuses the dataclass type defaults, object instance analysis preserves constructor defaults, and tests document that ObjectState-owned current values are separate from callable defaults.\n\nValidation: PYTHONPATH=src uv run --no-sync pytest tests/test_signature_analyzer.py tests/test_unified_parameter_analyzer.py -q
1 parent 322be0a commit 345ca16

4 files changed

Lines changed: 15 additions & 29 deletions

File tree

src/python_introspect/signature_analyzer.py

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,23 +1302,13 @@ def extract_field_documentation_from_context(field_name: str, context_types: lis
13021302

13031303
@staticmethod
13041304
def _analyze_dataclass_instance(instance: object) -> Dict[str, ParameterInfo]:
1305-
"""Extract parameter information from a dataclass instance."""
1306-
try:
1307-
# Get the type and analyze it
1308-
dataclass_type = type(instance)
1309-
parameters = SignatureAnalyzer._analyze_dataclass(dataclass_type)
1310-
1311-
for name, param_info in parameters.items():
1312-
current_value = object.__getattribute__(instance, name)
1313-
parameters[name] = ParameterInfo(
1314-
name=param_info.name,
1315-
param_type=param_info.param_type,
1316-
default_value=current_value,
1317-
is_required=param_info.is_required,
1318-
description=param_info.description
1319-
)
1305+
"""Extract parameter information from a dataclass instance.
13201306
1321-
return parameters
1307+
Defaults come from the dataclass type, not from current instance values.
1308+
Instance values are caller-owned current state, not signature defaults.
1309+
"""
1310+
try:
1311+
return SignatureAnalyzer._analyze_dataclass(type(instance))
13221312

13231313
except Exception:
13241314
return {}

src/python_introspect/unified_parameter_analyzer.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,15 +302,10 @@ def _analyze_object_instance(instance: object) -> Dict[str, UnifiedParameterInfo
302302
# Add parameters that haven't been seen yet (most specific wins)
303303
for param_name, param_info in class_params.items():
304304
if param_name not in all_params and param_name != 'kwargs':
305-
instance_values = vars(instance)
306-
default_value = instance_values.get(
307-
param_name,
308-
param_info.default_value,
309-
)
310305
all_params[param_name] = UnifiedParameterInfo(
311306
name=param_name,
312307
param_type=param_info.param_type,
313-
default_value=default_value,
308+
default_value=param_info.default_value,
314309
is_required=param_info.is_required,
315310
description=param_info.description,
316311
source_type="object_instance"

tests/test_signature_analyzer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ class Config:
136136
analyzer = SignatureAnalyzer()
137137
params = analyzer.analyze(instance)
138138

139-
assert params["name"].default_value == "custom"
140-
assert params["value"].default_value == 42
139+
assert params["name"].default_value == "default"
140+
assert params["value"].default_value == 10
141141

142142
def test_analyze_method(self):
143143
"""Test analyzing class methods."""

tests/test_unified_parameter_analyzer.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class Config:
6767
analyzer = UnifiedParameterAnalyzer()
6868
params = analyzer.analyze(instance)
6969

70-
assert params["name"].default_value == "custom"
71-
assert params["value"].default_value == 42
70+
assert params["name"].default_value == "default"
71+
assert params["value"].default_value == 10
7272
assert params["name"].source_type == "dataclass_instance"
7373

7474
def test_analyze_with_exclusions(self):
@@ -320,9 +320,10 @@ def __init__(self, name: str, value: int = 10):
320320
# Should get parameters from __init__
321321
assert "name" in params
322322
assert "value" in params
323-
# Instance values should be used
324-
assert params["name"].default_value == "test"
325-
assert params["value"].default_value == 20
323+
# Constructor defaults remain the default authority; instance values are
324+
# current state owned by callers such as ObjectState, not defaults.
325+
assert params["name"].default_value is None
326+
assert params["value"].default_value == 10
326327

327328
def test_analyze_inherited_parameters(self):
328329
"""Test analyzing object with inherited parameters."""

0 commit comments

Comments
 (0)