[code-quality] Having trouble making pylint+astroid truly ignore context
Claudiu Popa
pcmanticore at gmail.com
Sat Apr 4 01:29:19 CEST 2015
On Sat, Apr 4, 2015 at 1:25 AM, Daniel Balparda (梅巴達)
<code-quality at python.org> wrote:
>
> Hi,
>
> Inside Google we use pylint in many ways. In some we have plenty
> context for imports, etc. In others we have only on file in isolation and
> need to lint it the best we can without any context for imports, etc. To
> support that we have a pylint mode where it should ignore everything
> but the file given to it.
>
> This has been kind of working for a long time, but some bugs were
> filed where we noticed our pylint was in fact behaving differently for
> files with context available and those without. I eventually traced the
> issue to the fact that when astroid sees a star import (from foo import *)
> it will try to load symbols for the import. When the import makes sense
> (in one example, the file is in a directory where it may work) it succeeds
> in importing symbols; when the import makes no sense (in another example,
> the file is isolated somewhere python won't find any symbol to import)
> then it will not add the symbols.
>
> The specific place this happens is in astroid/builder.py:
>
> def add_from_names_to_locals(self, node):
> """store imported names to the locals;
> resort the locals if coming from a delayed node
> """
> _key_func = lambda node: node.fromlineno
> def sort_locals(my_list):
> my_list.sort(key=_key_func)
> for (name, asname) in node.names:
> if name == '*':
> try:
> imported = node.do_import_module()
> except InferenceError:
> continue
> for name in imported.wildcard_import_names():
> node.parent.set_local(name, node)
> sort_locals(node.parent.scope().locals[name])
> else:
> node.parent.set_local(asname or name, node)
> sort_locals(node.parent.scope().locals[asname or name])
>
> My questions is: Is there a (non-hacky) way of telling astroid/pylint
> that I really really don't want them to consider anything else from
> context and actually use only the file I provided? If not, is it reasonable
> to add an option for that? (I can do the coding, but not before discussing
> our options.)
No, currently there's no way to do that, but I can see this as an option
in astroid, which is propagated from Pylint. The use case sounds
reasonable enough, so if you can provide a patch, I'll be sure to review it.
More information about the code-quality
mailing list