diff --git a/python/src/com/jetbrains/python/inspections/PyDataclassInspection.kt b/python/src/com/jetbrains/python/inspections/PyDataclassInspection.kt index 5f6d8bd56710..95c843c6033a 100644 --- a/python/src/com/jetbrains/python/inspections/PyDataclassInspection.kt +++ b/python/src/com/jetbrains/python/inspections/PyDataclassInspection.kt @@ -26,8 +26,12 @@ class PyDataclassInspection : PyInspection() { companion object { private val ORDER_OPERATORS = setOf("__lt__", "__le__", "__gt__", "__ge__") private val DATACLASSES_HELPERS = setOf("dataclasses.fields", "dataclasses.asdict", "dataclasses.astuple", "dataclasses.replace") - private val ATTRS_HELPERS = - setOf("attr.__init__.fields", "attr.__init__.asdict", "attr.__init__.astuple", "attr.__init__.assoc", "attr.__init__.evolve") + private val ATTRS_HELPERS = setOf("attr.__init__.fields", + "attr.__init__.fields_dict", + "attr.__init__.asdict", + "attr.__init__.astuple", + "attr.__init__.assoc", + "attr.__init__.evolve") } override fun buildVisitor(holder: ProblemsHolder, @@ -522,7 +526,7 @@ class PyDataclassInspection : PyInspection() { private fun processHelperAttrsArgument(argument: PyExpression?, calleeQName: String) { if (argument == null) return - val instance = calleeQName != "attr.__init__.fields" + val instance = calleeQName != "attr.__init__.fields" && calleeQName != "attr.__init__.fields_dict" if (isNotExpectedDataclass(myTypeEvalContext.getType(argument), PyDataclassParameters.Type.ATTRS, !instance, instance)) { val presentableCalleeQName = calleeQName.replaceFirst(".__init__.", ".") diff --git a/python/testData/inspections/PyDataclassInspection/attrsHelpersArgument.py b/python/testData/inspections/PyDataclassInspection/attrsHelpersArgument.py index d425eb835f2d..9cf1ac80dba3 100644 --- a/python/testData/inspections/PyDataclassInspection/attrsHelpersArgument.py +++ b/python/testData/inspections/PyDataclassInspection/attrsHelpersArgument.py @@ -9,6 +9,9 @@ class A: attr.fields(A) attr.fields(A()) +attr.fields_dict(A) +attr.fields_dict(A()) + attr.asdict(A()) attr.astuple(A()) attr.assoc(A()) @@ -23,6 +26,9 @@ class B: attr.fields(B) attr.fields(B()) +attr.fields_dict(B) +attr.fields_dict(B()) + attr.asdict(B()) attr.astuple(B()) attr.assoc(B()) @@ -36,6 +42,7 @@ attr.evolve(p) + attr.fields_dict(p) attr.asdict(p) attr.astuple(p) @@ -62,6 +71,7 @@ def union1(p: Union[A, B]): def union2(p: Union[Type[A], Type[B]]): attr.fields(p) + attr.fields_dict(p) attr.asdict(p) attr.astuple(p)