Skip to content

Commit

Permalink
[sys.argv] Make 'sys.argv' uninferable because it never is
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 committed Jul 8, 2023
1 parent 4d77ff6 commit a3d3b43
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 @@ -1062,7 +1062,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 @@ -7205,3 +7205,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 a3d3b43

Please sign in to comment.