summaryrefslogtreecommitdiff
path: root/astroid/protocols.py
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2019-11-25 08:32:49 +0100
committerClaudiu Popa <pcmanticore@gmail.com>2019-11-25 08:32:49 +0100
commit130406463f3c978571a7aca6e33c985e17848f21 (patch)
treefcb51e52ab231c0e047d85656fbb30567653434c /astroid/protocols.py
parent05a9106b539182610c1153fbe6ad6fbe8a6d7d58 (diff)
downloadastroid-git-130406463f3c978571a7aca6e33c985e17848f21.tar.gz
Scope the inference to the current bound node when inferring instances of classes
When inferring instances of classes from arguments, such as ``self`` in a bound method, we could use as a hint the context's ``boundnode``, which indicates the instance from which the inference originated. As an example, a subclass that uses a parent's method which returns ``self``, will override the ``self`` to point to it instead of pointing to the parent class. Close PyCQA/pylint#3157
Diffstat (limited to 'astroid/protocols.py')
-rw-r--r--astroid/protocols.py2
1 files changed, 2 insertions, 0 deletions
diff --git a/astroid/protocols.py b/astroid/protocols.py
index 891af0f6..bd1fede1 100644
--- a/astroid/protocols.py
+++ b/astroid/protocols.py
@@ -324,6 +324,8 @@ def _arguments_infer_argname(self, name, context):
is_metaclass = isinstance(cls, nodes.ClassDef) and cls.type == "metaclass"
# If this is a metaclass, then the first argument will always
# be the class, not an instance.
+ if context.boundnode and isinstance(context.boundnode, bases.Instance):
+ cls = context.boundnode._proxied
if is_metaclass or functype == "classmethod":
yield cls
return