Comments (6)
Thanks for the question. As you pointed out, mutable defaults are copied, so for example list_field = field(default_factory=list)
in dataclasses becomes simply list_field: List = []
with dataclassy. Or, as a more complicated example, dd_field: Dict = field(default_factory=lambda: defaultdict(list))
becomes dd_field: Dict = defaultdict(list)
.
I couldn't think of a use case this alternative mechanism wouldn't cover. Do you have one in mind?
from dataclassy.
I couldn't think of a use case this alternative mechanism wouldn't cover. Do you have one in mind?
What if I have a field that will contain instances of MyCustomClass
?
How would I specify this?
from dataclassy.
If you define a copy
method for the class it should work.
from dataclassy.
I suppose this naturally raises the question of whether this is ideal. My thinking, as implied earlier, is that in the clear majority of cases where a default value can't be shared between instances it is for the reason that it is mutable, so copying it will suffice. In the case of collections, this is a clear advantage (imo) since it reduces the repetitiveness of lambdas. This would definitely be a disadvantage if you commonly wanted to create class instances, particularly if you wanted to create instances of classes you don't control.
Another option to the above solution would be to use post-initialisation logic:
@dataclass
class Example:
mcc: MyCustomClass = None
def __init__(self, mcc=None):
self.mcc = MyCustomClass()
This has the major advantage of flexibility - you can do logic as complex as you like in there, including initialising MyCustomClass
based on other fields of the dataclass or additional parameters to __init__
. And of course, there is no need to define a copy
method.
I admit that this is still not as "nice" as dataclasses' default_factory
. However, adding a field
clone would go almost violently against dataclassy's ethos of radical simplicity in its own codebase, especially as this is essentially the only parameter that there won't be a lighter-weight equivalent for. That's the reason it's not there already. I'm still very interested in hearing people's thoughts on this though.
from dataclassy.
As of 03cebc9 this is now possible with
@dataclass
class Example:
mcc: MyCustomClass = None
def __init__(self):
self.mcc = MyCustomClass()
and an example has been added to the README to document this.
from dataclassy.
For future readers, as of release v0.9, this is now possible:
@dataclass
class Example:
mcc: MyCustomClass = factory(MyCustomClass)
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.