PY-57582 dataclasses: field with default value preceding KW_ONLY shows false-positive warning

- support marker field typed with KW_ONLY
- adjust other inspection message

GitOrigin-RevId: 28f30ffcc3400bc719c63eacd76e432a547a1a9c
This commit is contained in:
Marcus Mews
2025-09-26 07:22:47 +00:00
committed by intellij-monorepo-bot
parent 041ec1f6e2
commit eb3eeb0fca
12 changed files with 99 additions and 44 deletions
@@ -4,5 +4,5 @@ from mod import Base
@dataclasses.dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'Base'">Sub</error>(Base):
field_no_default: int
class Sub(Base):
<error descr="Non-default argument(s) follows default argument(s) defined in 'Base'">field_no_default</error>: int
@@ -3,8 +3,8 @@ from decorator import my_dataclass
@my_dataclass()
class <error descr="Non-default argument(s) follows default argument(s) defined in 'A1'">B1</error>(A1):
y1: str
class B1(A1):
<error descr="Non-default argument(s) follows default argument(s) defined in 'A1'">y1</error>: str
y2: str = "1"
@@ -54,8 +54,8 @@ class BaseNotKwOnlyDefault:
@my_dataclass()
class <error descr="Non-default argument(s) follows default argument(s) defined in 'BaseNotKwOnlyDefault'">SubNotKwOnly</error>(BaseNotKwOnlyDefault):
not_kw_only_no_default: int
class SubNotKwOnly(BaseNotKwOnlyDefault):
<error descr="Non-default argument(s) follows default argument(s) defined in 'BaseNotKwOnlyDefault'">not_kw_only_no_default</error>: int
@my_dataclass(kw_only=True)
@@ -4,5 +4,5 @@ from mod import Base
@dataclasses.dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'Base'">Sub</error>(Base):
field_no_default: int
class Sub(Base):
<error descr="Non-default argument(s) follows default argument(s) defined in 'Base'">field_no_default</error>: int
@@ -7,8 +7,8 @@ class A1:
x2: int = 1
@dataclasses.dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'A1'">B1</error>(A1):
y1: str
class B1(A1):
<error descr="Non-default argument(s) follows default argument(s) defined in 'A1'">y1</error>: str
y2: str = "1"
@attr.dataclass
@@ -17,8 +17,8 @@ class A2:
x2: int = 1
@attr.dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'A2'">B2</error>(A2):
y1: str
class B2(A2):
<error descr="Non-default argument(s) follows default argument(s) defined in 'A2'">y1</error>: str
y2: str = "1"
@dataclasses.dataclass
@@ -0,0 +1,28 @@
from dataclasses import dataclass, KW_ONLY
from typing import NamedTuple
@dataclass
class A1:
bar1: int = 1 # no error
_: KW_ONLY
bar2: int
@dataclass
class Base:
x: int = 0
@dataclass
class Child1(Base):
<error descr="Non-default argument(s) follows default argument(s) defined in 'Base'">y</error>: int
_: KW_ONLY
z: int = 1
@dataclass
class Child2(Base):
_: KW_ONLY
y: int # no error
z: int = 1
@@ -12,16 +12,16 @@ class A1(B):
b: int
@dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'B'">A2</error>(B):
class A2(B):
a: int
c: int
<error descr="Non-default argument(s) follows default argument(s) defined in 'B'">c</error>: int
b: int
@dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'B'">A3</error>(B):
class A3(B):
a: int
b: int
c: int
<error descr="Non-default argument(s) follows default argument(s) defined in 'B'">c</error>: int
@dataclass
class A4(B):
@@ -30,25 +30,25 @@ class A4(B):
c: int = 1
@dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'B'">A5</error>(B):
class A5(B):
a: int
<error descr="Fields with a default value must come after any fields without a default.">c</error>: int = 1
<error descr="Fields with a default value must come after any fields without a default.">d</error>: int = 1
b: int
e: int
<error descr="Non-default argument(s) follows default argument(s) defined in 'B'">e</error>: int
@dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'B'">A6</error>(B):
class A6(B):
a: int
<error descr="Fields with a default value must come after any fields without a default.">c</error>: int = 1
d: int
<error descr="Non-default argument(s) follows default argument(s) defined in 'B'">d</error>: int
e: int
b: int = 1
@dataclass
class <error descr="Non-default argument(s) follows default argument(s) defined in 'B'">A7</error>(B):
class A7(B):
a: int
b: int
<error descr="Fields with a default value must come after any fields without a default.">c</error>: int = 1
<error descr="Fields with a default value must come after any fields without a default.">d</error>: int = 1
e: int
<error descr="Non-default argument(s) follows default argument(s) defined in 'B'">e</error>: int
@@ -0,0 +1,9 @@
from typing import NamedTuple
from dataclasses import KW_ONLY
class NoDataclass(NamedTuple):
y: int
_: KW_ONLY # no effect
<error descr="Fields with a default value must come after any fields without a default.">z</error>: int = 1
bar2: int