Skip to content

Commit

Permalink
Make sys.argv uninferable because it never is (#2244)
Browse files Browse the repository at this point in the history
It's impossible to infer the value it will have outside of static analysis where it's our own value.

See pylint-dev/pylint#7710
  • Loading branch information
Pierre-Sassoulas authored Sep 23, 2023
1 parent 989a89d commit ea78827
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
7 changes: 6 additions & 1 deletion astroid/nodes/node_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -1099,7 +1099,12 @@ def _infer_attribute(
if isinstance(owner, (ClassDef, Instance)):
frame = owner if isinstance(owner, ClassDef) else owner._proxied
context.constraints[node.attrname] = get_constraints(node, frame=frame)
yield from owner.igetattr(node.attrname, context)
if node.attrname == "argv" and owner.name == "sys":
# sys.argv will never be inferable during static analysis
# It's value would be the args passed to the linter itself
yield util.Uninferable
else:
yield from owner.igetattr(node.attrname, context)
except (
AttributeInferenceError,
InferenceError,
Expand Down
15 changes: 15 additions & 0 deletions tests/test_inference.py
Original file line number Diff line number Diff line change
Expand Up @@ -7238,3 +7238,18 @@ def test_old_style_string_formatting_with_specs(self) -> None:
inferred = next(node.infer())
assert isinstance(inferred, nodes.Const)
assert inferred.value == "My name is Daniel, I'm 12.00"


def test_sys_argv_uninferable() -> None:
"""Regression test for https://github.com/pylint-dev/pylint/issues/7710."""
a: nodes.List = extract_node(
textwrap.dedent(
"""
import sys
sys.argv"""
)
)
sys_argv_value = list(a._infer())
assert len(sys_argv_value) == 1
assert sys_argv_value[0] is Uninferable

0 comments on commit ea78827

Please sign in to comment.