On 18 February 2018 at 14:10, Guido van Rossum <[email protected]> wrote:
> Agreed the __pre_init__ idea is no improvement. I think we're back where you
> started -- just use `object.__setattr__` to set the attribute in
> `__post_init__`. That's what the PEP says is used by the generated
> `__init__`, so I think it is reasonable to copy that pattern. Presumably the
> situation doesn't occur that frequently in real code (__post_init__ feels
> like a last resort hack anyway).
FWIW, if someone really wanted to create a 3rd party context manager
to assist with this they can do:
@contextmanager
def mutable(obj):
cls = obj.__class__
obj.__class__ = object
try:
yield obj
finally:
obj.__class__ = cls
@dataclass(frozen=True)
class C:
i: int
j: int = None
database: InitVar[DatabaseType] = None
def __post_init__(self, database):
if self.j is None and database is not None:
with mutable(self):
self.j = database.lookup('j')
Using object.__setattr__ explicitly would be clearer, though.
Cheers,
Nick.
--
Nick Coghlan | [email protected] | Brisbane, Australia
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com