Skip to content

Crash when adding pylint_flask_sqlalchemy to the --load-plugins in pycharm #9388

Closed
@elanor-sparx

Description

@elanor-sparx

Bug description

When parsing the following a.py:

Proprietary code removed

Pycharm external tools arguments used to create the crash:

--msg-template="/Users/xxx/code/xxxtools/python/dashboard/{path}:{line}:{column}:{C}:({symbol}){msg}"
--load-plugins="pylint_flask,pylint_flask_sqlalchemy"
$FileDir$

There is no crash when I instead use:

--msg-template="/Users/xxx/code/xxxtools/python/dashboard/{path}:{line}:{column}:{C}:({symbol}){msg}"
--load-plugins="pylint_flask"
$FileDir$

Becomes:

/Users/xxx/code/xxxtools/python/dashboard/venv/bin/pylint --msg-template=/Users/xxx/code/xxxtools/python/dashboard/{path}:{line}:{column}:{C}:({symbol}){msg} --load-plugins=pylint_flask,pylint_flask_sqlalchemy /Users/xxx/code/xxxtools/python/dashboard/app/admin

Error I was trying to get rid of by including pylint_flask_sqlalchemy:

E:(no-member)Instance of 'SQLAlchemy' has no 'func' member

on code line

x = MyObject.query.filter(
        db.func.date(MyObject.timestamp) == given_date
    ).order_by(MyObject.timestamp.desc())

Other issues with AstroidErrors: #8842, #9139
Reason I am submitting a fresh issue: The above issues don't mention plugins. This is almost certainly an issue with pylint_flask_sqlalchemy, but perhaps pylint might be able to fail gracefully when a plugin blows up.

Command used

pylint a.py

Pylint output

pylint crashed with a ``AstroidError`` and with the following stacktrace:
Traceback (most recent call last):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 788, in _lint_file
    check_astroid_module(module)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 1017, in check_astroid_module
    retval = self._check_astroid_module(
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 1069, in _check_astroid_module
    walker.walk(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/utils/ast_walker.py", line 94, in walk
    self.walk(child)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/utils/ast_walker.py", line 91, in walk
    callback(astroid)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/checkers/variables.py", line 2059, in visit_importfrom
    self._check_module_attrs(node, module, name.split("."))
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/checkers/variables.py", line 3066, in _check_module_attrs
    module = next(module.getattr(name)[0].infer())
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_ng.py", line 169, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 90, in inner
    yield next(generator)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/bases.py", line 179, in _infer_stmts
    for inf in stmt.infer(context=context):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_ng.py", line 169, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 90, in inner
    yield next(generator)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_classes.py", line 1756, in _infer
    for callee in self.func.infer(context):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_ng.py", line 169, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 90, in inner
    yield next(generator)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/bases.py", line 179, in _infer_stmts
    for inf in stmt.infer(context=context):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_ng.py", line 169, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 90, in inner
    yield next(generator)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_classes.py", line 2863, in _infer
    module = self.do_import_module()
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/_base_nodes.py", line 168, in do_import_module
    return mymodule.import_module(
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py", line 453, in import_module
    return AstroidManager().ast_from_module_name(
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/manager.py", line 259, in ast_from_module_name
    return self.ast_from_file(found_spec.location, modname, fallback=False)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/manager.py", line 151, in ast_from_file
    return AstroidBuilder(self).file_build(filepath, modname)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/builder.py", line 140, in file_build
    return self._post_build(module, builder, encoding)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/builder.py", line 168, in _post_build
    module = self._manager.visit_transforms(module)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/manager.py", line 114, in visit_transforms
    return self._transform.visit(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 151, in visit
    return self._visit(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 81, in _visit
    visited = self._visit_generic(value)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 112, in _visit_generic
    return [self._visit_generic(child) for child in node]
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 112, in <listcomp>
    return [self._visit_generic(child) for child in node]
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 118, in _visit_generic
    return self._visit(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 84, in _visit
    return self._transform(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 66, in _transform
    ret = transform_func(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint_flask_sqlalchemy/__init__.py", line 24, in transform
    cls.locals[key] = [ClassDef(key, None)]
TypeError: __init__() missing 2 required positional arguments: 'col_offset' and 'parent'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 752, in _lint_files
    self._lint_file(fileitem, module, check_astroid_module)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 790, in _lint_file
    raise astroid.AstroidError from e
astroid.exceptions.AstroidError

Expected behavior

No crash.

Pylint version

pylint 3.0.3
astroid 3.0.2
Python 3.9.6 (default, Nov 10 2023, 13:38:27) 
[Clang 15.0.0 (clang-1500.1.0.2.5)]

OS / Environment

darwin (Darwin)

Additional dependencies

Metadata

Metadata

Assignees

No one assigned

    Labels

    Downstream Bug 🪲The problem happens in a lib depending on pylint, not pylint

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions