diff options
author | Claudiu Popa <pcmanticore@gmail.com> | 2019-11-25 08:32:49 +0100 |
---|---|---|
committer | Claudiu Popa <pcmanticore@gmail.com> | 2019-11-25 08:32:49 +0100 |
commit | 130406463f3c978571a7aca6e33c985e17848f21 (patch) | |
tree | fcb51e52ab231c0e047d85656fbb30567653434c /astroid/protocols.py | |
parent | 05a9106b539182610c1153fbe6ad6fbe8a6d7d58 (diff) | |
download | astroid-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.py | 2 |
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 |