diff --git a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java index 18894d5e12a4..32fd53b56f0e 100644 --- a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java @@ -25,6 +25,7 @@ import com.jetbrains.python.PyBundle; import com.jetbrains.python.PyNames; import com.jetbrains.python.codeInsight.controlflow.ScopeOwner; import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil; +import com.jetbrains.python.codeInsight.stdlib.PyNamedTupleType; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyReferenceExpression; @@ -72,6 +73,7 @@ public class PyProtectedMemberInspection extends PyInspection { public void visitPyReferenceExpression(PyReferenceExpression node) { final PyExpression qualifier = node.getQualifier(); if (qualifier == null || PyNames.CANONICAL_SELF.equals(qualifier.getText())) return; + if (myTypeEvalContext.getType(qualifier) instanceof PyNamedTupleType) return; final String name = node.getName(); if (name != null && name.startsWith("_") && !name.startsWith("__") && !name.endsWith("__")) { final PyClass parentClass = getClassOwner(node); diff --git a/python/testData/inspections/PyProtectedMemberInspection/namedTuple.py b/python/testData/inspections/PyProtectedMemberInspection/namedTuple.py new file mode 100644 index 000000000000..905088a1ba69 --- /dev/null +++ b/python/testData/inspections/PyProtectedMemberInspection/namedTuple.py @@ -0,0 +1,6 @@ +from collections import namedtuple + +i = namedtuple('Point', ['x', 'y'], verbose=True) +i._replace( **{"a":"a"}) + + diff --git a/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java index 3daa7e36e311..3c5969f27c1e 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java @@ -50,6 +50,10 @@ public class PyProtectedMemberInspectionTest extends PyTestCase { doTest(); } + public void testNamedTuple() { + doTest(); + } + public void testModule() { myFixture.configureByFiles(getTestName(true) + ".py", "tmp.py"); myFixture.enableInspections(PyProtectedMemberInspection.class);