On Dec 11, 2019, at 15:40, Arthur Pastel <arthur.pas...@gmail.com> wrote: > >> If dataclass handled freezeable types (the objects are mutable until you >> call freeze, >> after which they’re not), this would be easy (frozen now just means >> freezable, plus freeze >> is called by the generated __init__ right after the __post_init__). But it >> doesn’t, >> because freezing is complicated. > I don't really get your point here ...
If you don’t understand freezable, I guess you’re not going to propose it as an answer, so don’t worry about it? >> So, what else could you do? Make __setattr__ check the stack and see if it’s >> being >> called from type(self).__post_init__? > Yes I think this is one possibility. I guess, but not a good one. Stack inspection is generally considered a huge code smell. For example, whenever someone on this list says “Python should add X”, and someone replies “you can already do X if you’re willing to do some hacky stack inspection”, nobody takes that as an argument that Python doesn’t need to add X. Also, stack inspection isn’t even guaranteed to work in other Python implementations, so someone would have to come up with their own different way of implementing this feature for such implementations anyway. >> Add an extra hidden attribute to every instance just >> to track whether you’re inside __post_init__ so __setattr__ can check it? > This is better in my opinion. Better, but still not good. People care how big their objects are, especially when they’re using slots or namedtuple or dataclass. If most of my program’s memory use is zillions of instances of tiny data classes, and Python 3.10 makes every one of them 8 bytes bigger so my total memory use goes up 32%, I’m not going to be happy. All of my implementations are terrible ideas; arguing for one of them is unlikely to get you very far. You need to come up with something that isn’t terrible instead. > On top of this, to avoid having the extra hidden attribute maybe it would be > possible to dynamically define the __setattr__ method in the end of the > __post_init__ call. __setattr__, like most special methods, has to appear on the class, not the instance. So you can’t dynamically redefine it. (Plus, even if you could, it would again add 8 bytes to every instance.) _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/6AOO3Y2AWPJ3XAK4R2TKZBAJN6J3HNRQ/ Code of Conduct: http://python.org/psf/codeofconduct/