Skip to content

Commit 25cc58f

Browse files
committed
fix: Don't resolve attribute values to attribute with same name
Issue-367: #367
1 parent 716d27b commit 25cc58f

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/_griffe/models.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,9 +2075,22 @@ def resolve(self, name: str) -> str:
20752075
Returns:
20762076
The resolved name.
20772077
"""
2078-
# We're in an `__init__` method and name is a parameter name.
2079-
if self.parent and self.name == "__init__" and name in self.parameters:
2080-
return f"{self.parent.path}({name})"
2078+
# We're in an `__init__` method...
2079+
if self.parent and self.name == "__init__":
2080+
# ...and name is a parameter name: resolve to the parameter.
2081+
if name in self.parameters:
2082+
return f"{self.parent.path}({name})"
2083+
2084+
# Kind of a special case: we avoid resolving to instance-attributes from a function scope.
2085+
# See issue https://github.com/mkdocstrings/griffe/issues/367.
2086+
resolved = super().resolve(name)
2087+
try:
2088+
obj = self.modules_collection.get_member(resolved)
2089+
except KeyError:
2090+
return resolved
2091+
if obj.is_attribute and "instance-attribute" in obj.labels:
2092+
raise NameResolutionError(name)
2093+
return resolved
20812094
return super().resolve(name)
20822095

20832096
def as_dict(self, **kwargs: Any) -> dict[str, Any]:

tests/test_models.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,3 +526,16 @@ def test_delete_parameters() -> None:
526526
del parameters[0]
527527
assert "x" not in parameters
528528
assert len(parameters) == 0
529+
530+
531+
def test_not_resolving_attribute_value_to_itself() -> None:
532+
"""Attribute values with same name don't resolve to themselves."""
533+
with temporary_visited_module(
534+
"""
535+
class A:
536+
def __init__(self):
537+
x = "something"
538+
self.x = x
539+
""",
540+
) as module:
541+
assert module["A.x"].value.canonical_path == "x" # Not `module.A.x`.

0 commit comments

Comments
 (0)