example-code-2e icon indicating copy to clipboard operation
example-code-2e copied to clipboard

Side effect of FrozenJSON.__getattr__ not raising KeyError

Open hayemj opened this issue 1 year ago • 0 comments

Hi Luciano,

In chapter 22 you mention that FrozenJSON.__getattr__() raising a KeyError is "not to confusing". However, today I discovered a side effect from this that is confusing: copy.copy(FrozenJSON({'name': 'Jim Bo', 'class': 1982})) raises a RecursionError.

Indeed the documentation states that an AttributeError should be raised (https://docs.python.org/3/reference/datamodel.html#object.getattr) and apparently this is relied upon in the stdlib. In the copy implementation a new instance of FrozenJSON is generated without the initializer being called. Then, when looking for some optional dunder methods (that are not found) the copy implementation triggers a __getattr__ call with self.__data not yet existing, triggering the recursion.

What I appreciate in your book is that you are always very precise about all types of unexpected side effects, so maybe you could consider spending some text on this in a future update.

Best regards, Michiel

hayemj avatar Jul 17 '24 20:07 hayemj