Comments (2)
DataClassMeta.new is invoked once by the dataclass decorator, and then once again going up the chain from
Derived
->Base
->DataClassMeta
(->type
), which sees the result of the first invocation and decides it doesn't need to add any new slots, only to have the result of the first invocation lost in the final result. Does that sound like a reasonable version of events?
Yes, if I understand your explanation correctly, this is indeed what happens. Using a metaclass means that DataClassMeta.__new__
is run for each new subclass, then applying the decorator means the subclass is replaced with a new version (this happens here if you are interested). It can cause issues.
If you're wondering, the way my fix works is by exploiting the fact that the dict_
passed in looks different between these two invocations. In the first instance (subclassing), the metaclass is called before Python has done any of its inheritance magic, meaning __slots__
is empty. In the second instance (decorator usage), the class is already fully formed, meaning __slots__
has been set, so it's not replaced.
This change also means that a user-defined __slots__
will not be wiped out which I think is good anyway.
from dataclassy.
Thanks for the detailed explanation and quick fix. I'm not sure I had it 100% in my original explanation, but it's clear what was going on now.
from dataclassy.
Related Issues (20)
- __dataclass_fields__ is missing HOT 3
- TypeError: argument of type 'NoneType' is not iterable HOT 3
- Add Python 3.10 to CI HOT 2
- Tests: make signature checks version-agnostic HOT 1
- __post_init__ and repeated decorator produces max recursion depth HOT 2
- Removing support for post-initialisation logic in `__init__`
- Question - How does this play with dacite? HOT 2
- Inheriting from a dataclass using ABCMeta causes `AttributeError` HOT 21
- Python 3.10 pattern matching HOT 6
- Circular references to dataclasses cause infinite recursion in __repr__ HOT 3
- Multi-level inheritance causes __get__ to fail on properties HOT 3
- Bug when mixing metaclasses w/ `dataclassy` (Python 3.6 only) HOT 8
- Internals are not considered in __eq__ HOT 10
- No "post-init only" marker HOT 1
- New mypy error with 0.11.0: Cannot instantiate type "Type[<nothing>]" HOT 2
- Error with dataclass with InitVar variable HOT 1
- Short-cut for the factory function (Feature request) HOT 2
- Late-init fields still appear in `__init__` HOT 1
- Add `internals` parameter to `as_dict`/`as_tuple` HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dataclassy.