Comments (5)
Interesting. I have never got round to benchmarking dataclasses versus this library. I was acutely aware that __call__
is very hot and probably far slower than object.__call__
(which I believe is implemented in C). __new__
is the real equivalent of dataclasses' __init__
so it would be interesting to compare this directly.
I haven't looked at how dataclasses passes arguments to __post_init__
, but it's likely it does it statically with metaprogramming rather than dynamically like dataclassy's current __call__
implementation. To be honest, the main reason I haven't obsessed too much about that method is that I use post-init processing very rarely, and when there isn't a custom __init__
dataclassy just uses object.__call__
. Now that the library is more or less feature-complete (as I see it so far) performance would be something good to focus on. If it would also be useful to you, any benchmarking you do would likely be very helpful in a new issue.
Anyway, good to know that it's fixed and also that it works with 3.9!
from dataclassy.
Thanks, I've fixed this but I'm not yet awake enough to be completely sure of exactly why it was broken before or commit a proper test!
from dataclassy.
Ah, it's because the earlier slice didn't consider the extra *args
parameter added in __new__
to allow argument pass-through to __init__
.
Not directly related to the bug but now we use a custom __call__
it might be neater to use the keyword-only indicator *
instead of *args
.
from dataclassy.
OK, I think that's everything 🙂 If you can confirm everything now works as expected I'll release an update to PyPI.
from dataclassy.
Awesome, I tested it and it works!
As a side note, it seems like dataclassy's performance is roughly twice that of the builtin dataclasses. On the project that encountered this bug (it creates many instances of a single dataclass) I was profiling, the runtime roughly doubles from 4 sec with dataclasses to 8 sec with dataclassy.
Most of the time spent is on dataclassy/dataclassy/dataclass.py:104(__call__)
and <string>:1(__new__)
, tested on Python 3.9.
No rush of course to improve this performance, I just wanted to provide a reference point in case you find it useful.
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
- Derived classes with @dataclass(slots=True) generate empty __slots__ HOT 2
- Bug when mixing metaclasses w/ `dataclassy` (Python 3.6 only) HOT 7
- 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.