Skip to content

Crash: AttributeError since concat f-string and string as a class function return value #2706

@plucury

Description

@plucury

Bug description

When parsing the following a.py:

class A():
    def a(self):
        desc = f"" + 'a'
        return desc

Command used

pylint a.py

Pylint output

pylint crashed with a ``AstroidError`` and with the following stacktrace:
Traceback (most recent call last):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/lint/pylinter.py", line 788, in _lint_file
    check_astroid_module(module)
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/lint/pylinter.py", line 1020, in check_astroid_module
    retval = self._check_astroid_module(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/lint/pylinter.py", line 1072, in _check_astroid_module
    walker.walk(node)
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/utils/ast_walker.py", line 90, in walk
    self.walk(child)
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/utils/ast_walker.py", line 90, in walk
    self.walk(child)
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/utils/ast_walker.py", line 87, in walk
    callback(astroid)
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/checkers/classes/special_methods_checker.py", line 183, in visit_functiondef
    inferred = _safe_infer_call_result(node, node)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/checkers/classes/special_methods_checker.py", line 42, in _safe_infer_call_result
    value = next(inferit)
            ^^^^^^^^^^^^^
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py", line 1658, in infer_call_result
    yield from returnnode.value.infer(context)
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/nodes/node_ng.py", line 168, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/decorators.py", line 86, in inner
    yield next(generator)
          ^^^^^^^^^^^^^^^
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/bases.py", line 177, in _infer_stmts
    for inf in stmt.infer(context=context):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/nodes/node_ng.py", line 168, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/decorators.py", line 86, in inner
    yield next(generator)
          ^^^^^^^^^^^^^^^
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/bases.py", line 177, in _infer_stmts
    for inf in stmt.infer(context=context):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/nodes/node_ng.py", line 168, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/decorators.py", line 69, in inner
    yield next(generator)
          ^^^^^^^^^^^^^^^
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/nodes/_base_nodes.py", line 336, in _filter_operation_errors
    for result in infer_callable(context):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/nodes/node_classes.py", line 1555, in _infer_binop
    yield from self._infer_binary_operation(
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/nodes/_base_nodes.py", line 641, in _infer_binary_operation
    left_type = helpers.object_type(left)
                ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/helpers.py", line 106, in object_type
    types = set(_object_type(node, context))
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/astroid/helpers.py", line 68, in _object_type
    for inferred in node.infer(context=context):
                    ^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'infer'

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

Traceback (most recent call last):
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/site-packages/pylint/lint/pylinter.py", line 752, in _lint_files
    self._lint_file(fileitem, module, check_astroid_module)
  File "/Users/xuzhangxuan/.pyenv/versions/3.11.10/envs/pylint_debug/lib/python3.11/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.3.5
astroid 3.3.9
Python 3.11.10 (main, Mar 11 2025, 10:34:09) [Clang 16.0.0 (clang-1600.0.26.6)]

OS / Environment

darwin (Darwin)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions