Re: [Python-Dev] Dataclasses, frozen and __post_init__

2018年2月18日 16:36:59 -0800

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

Reply via email to