Skip to content

Commit cf1c815

Browse files
Fix instance_attrs building error in Qt brain
1 parent caaf10d commit cf1c815

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ What's New in astroid 2.11.3?
1212
=============================
1313
Release date: TBA
1414

15+
* Fixed an error in the Qt brain when building ``instance_attrs``.
16+
17+
Closes PyCQA/pylint#6221
1518

1619

1720
What's New in astroid 2.11.2?

astroid/brain/brain_qt.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ def emit(self, *args):
3434
"""
3535
)
3636
signal_cls = module["pyqtSignal"]
37-
node.instance_attrs["emit"] = signal_cls["emit"]
38-
node.instance_attrs["disconnect"] = signal_cls["disconnect"]
39-
node.instance_attrs["connect"] = signal_cls["connect"]
37+
node.instance_attrs["emit"] = [signal_cls["emit"]]
38+
node.instance_attrs["disconnect"] = [signal_cls["disconnect"]]
39+
node.instance_attrs["connect"] = [signal_cls["connect"]]
4040

4141

4242
def transform_pyside_signal(node):
@@ -52,9 +52,9 @@ def emit(self, *args):
5252
"""
5353
)
5454
signal_cls = module["NotPySideSignal"]
55-
node.instance_attrs["connect"] = signal_cls["connect"]
56-
node.instance_attrs["disconnect"] = signal_cls["disconnect"]
57-
node.instance_attrs["emit"] = signal_cls["emit"]
55+
node.instance_attrs["connect"] = [signal_cls["connect"]]
56+
node.instance_attrs["disconnect"] = [signal_cls["disconnect"]]
57+
node.instance_attrs["emit"] = [signal_cls["emit"]]
5858

5959

6060
def pyqt4_qtcore_transform():

requirements_test_brain.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ types-attrs
33
nose
44
numpy>=1.17.0
55
python-dateutil
6+
PyQt6
67
types-python-dateutil
78
six
89
types-six

tests/unittest_brain_qt.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
2+
# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE
3+
# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt
4+
5+
from importlib.util import find_spec
6+
7+
import pytest
8+
9+
from astroid import extract_node
10+
from astroid.bases import UnboundMethod
11+
from astroid.manager import AstroidManager
12+
from astroid.nodes import FunctionDef
13+
14+
HAS_PYQT6 = find_spec("PyQt6")
15+
16+
17+
@pytest.mark.skipif(HAS_PYQT6 is None, reason="This test requires the PyQt6 library.")
18+
class TestBrainQt:
19+
@staticmethod
20+
def test_value_of_lambda_instance_attrs_is_list():
21+
"""Regression test for https://github.com/PyCQA/pylint/issues/6221
22+
23+
A crash occurred in pylint when a nodes.FunctionDef was iterated directly,
24+
giving items like "self" instead of iterating a one-element list containing
25+
the wanted nodes.FunctionDef.
26+
"""
27+
src = """
28+
from PyQt6 import QtPrintSupport as printsupport
29+
printsupport.QPrintPreviewDialog.paintRequested #@
30+
"""
31+
AstroidManager.brain["extension_package_whitelist"] = {"PyQt6.QtPrintSupport"}
32+
node = extract_node(src)
33+
attribute_node = node.inferred()[0]
34+
# scoped_nodes.Lambda.instance_attrs is typed as Dict[str, List[NodeNG]]
35+
assert isinstance(attribute_node, UnboundMethod)
36+
assert isinstance(attribute_node.instance_attrs["connect"][0], FunctionDef)

0 commit comments

Comments
 (0)