Why don’t we also add dataclasses.POS_ONLY as well? Anything before it is positional argument. 

@dataclasses.dataclass
class LotsOfFields:
    x: Any 
    y: Any
    z: Any 
    _:dataclasses.POS_ONLY 
    a: Any
    __: dataclasses.KW_ONLY
    b: Any = 0
    c: Any = 'foo'
    d: Any
    e: Any = 0.0
    f: Any
    g: Any = ()
    h: Any = 'bar'
    i: Any = 3+4j
    j: Any = 10
    k: Any

The generated __init__ would look like:

def __init__(self, x, y, z, /, a, *, b=0, c='foo', d, e=0.0, f, g=(), h='bar', i=3+4j, j=10, k):

Similar to dataclasses.KW_ONLY, you can use dataclasses.POS_ONLY only once. It should always come before dataclasses.KW_ONLY. Anything else, it should raise an error. If dataclasses.POS_ONLY came right after the class declaration (no instance attribute preceding it), an error is generated similar to what we have right now. Inheritance is build up (from super class to sub class) of three groups of arguments: pos_only arguments together, then mixed arguments, and then kw_only arguments. repr should work the same way. We would like to reconstruct the object from repr. We don’t want too much change from current behavior. 

Lets create a class that inherits from the above class.. 

@dataclasses.dataclass
class LessFields(LotsOfFields):
x2: Any
_: dataclasses.POS_ONLY 
a2: Any 
__:dataclasses.KW_ONLY 
b2: Any 

The generated __init__ would look like:

def __init__(self, x, y, z, x2, /, a, a2, *, b=0, c='foo', d, e=0.0, f, g=(), h='bar', i=3+4j, j=10, k, b2):

Another class.. 

@dataclasses.dataclass 
Class EvenLessFields(LessFields):
a3: Any
_: dataclasses.KW_ONLY
b3: Any = 9 

The generated __init__ would look like:

def __init__(self, x, y, z, x2, /, a, a2, a3, *, b=0, c='foo', d, e=0.0, f, g=(), h='bar', i=3+4j, j=10, k, b2, b3=9):

All arguments are ordered from the super super class until the subclass all in their respective path or group of arguments. 

Abdulla 

On 16 Mar 2021, at 1:18 AM, Eric V. Smith <eric@trueblade.com> wrote:

@dataclasses.dataclass
class LotsOfFields:
    a: Any
    _: dataclasses.KW_ONLY
    b: Any = 0
    c: Any = 'foo'
    d: Any
    e: Any = 0.0
    f: Any
    g: Any = ()
    h: Any = 'bar'
    i: Any = 3+4j
    j: Any = 10
    k: Any

Which I think is a lot clearer.

The generated __init__ would look like:

def __init__(self, a, *, b=0, c='foo', d, e=0.0, f, g=(), h='bar', i=3+4j, j=10, k):