Paul Pinterits <rawi...@gmail.com> added the comment:

Admittedly, with the way dataclasses accept their __init__ arguments, figuring 
out which arguments to consume and which to pass on isn't a trivial task.

If a dataclass Bar inherits from a dataclass Foo, then Bar.__init__ is (for all 
intents and purposes) defined as

    def __init__(self, foo, bar):

Because the arguments for the parents *precede* the arguments for Bar, it's not 
easy to create an equivalent __init__ without knowing anything about the base 
class(es)'s constructor arguments. But that doesn't mean it's impossible:

```
class Foo:
    foo: int
    
    def __init__(self):
        self.foo = 5
    
class Bar(Foo):
    bar: int
    
    def __init__(self, *args, **kwargs):
        if 'bar' in kwargs:
            self.bar = kwargs.pop('bar')
        else:
            *args, self.bar = args
        
        super().__init__(*args, **kwargs)

print([Bar(1), Bar(bar=1)])
```

Essentially, Bar.__init__ looks for a keyword argument named 'bar', and if that 
doesn't exist, it uses the last positional argument as the value for 'bar'.

This is backwards compatible with "normal" dataclasses, and improves support 
for dataclasses with custom __init__s.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue43835>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to