Hacker News new | ask | show | jobs
by divbzero 1640 days ago
The @dataclass decorator [1] as proposed in PEP 557 [2] has also been available since Python 3.7 was released in 2018.

Using @dataclass the example from OP would look like:

  from dataclasses import dataclass
  
  @dataclass
  class Point3D:
      x: float
      y: float
      z: float
[1]: https://docs.python.org/3/library/dataclasses.html

[2]: https://www.python.org/dev/peps/pep-0557/

1 comments

As soon as I opened the article I pressed Cmd+F and searched for "dataclasses".

This article was correct and addressed a very real need in Python programming—for year 2016. By now it is obsolete and today's standard library module `dataclasses` does all of that and more.

attrs classes still have several features that dataclasses don't, and likely never will, [like validators and converters](https://www.attrs.org/en/stable/why.html#data-classes). So it's not obsolete, particularly for anyone already relying on those features.
dataclasses have methods for iterating fields and inspecting types, so any feature can be added. There is also the benefit of type checking. My grief with dataclasses is how I can't inherit from dataclasses with default fields without making all child class fields also have defaults.
dataclasses author here.

Does the keyword-only feature in 3.10 help you at all?

Wow, I was unaware of this feature. It appears there are 3 ways to declare fields as keyword-only.

    @dataclass(kw_only=True)
    class Birthday:
        name: str
        birthday: datetime.date

    # ---

    @dataclass
    class Birthday:
        name: str
        birthday: datetime.date = field(kw_only=True)

    # ---

    from dataclasses import KW_ONLY

    @dataclass
    class Point:
        x: float
        y: float
        _: KW_ONLY
        z: float = 0.0
        t: float = 0.0

https://docs.python.org/3/whatsnew/3.10.html#keyword-only-fi...
And a big thank you for the dataclasses module, and for making the life of the whole python community a little easier!
Love it, thank you!
Echoing the other commenter, attrs is generally superior to dataclasses (dataclasses is a feature-limited std library "backport" of attrs). It will be updated less often and support less stuff. The only real reason to use dataclasses is if you want to avoid a third-party dependency, which is sometimes valid but doesn't make the more featureful version "obsolete".
Is there a reason those features weren't added to data classes?

I don't know much about attrs, only professionally coming to python since 3.7, but I'm not going to bring it in if there's something sufficient in the language

Not really, other than they decided to keep data classes very minimal, as standard library comes with maintenance costs (you can't get rid of a feature once you add it), so they kept the strict features, since everyone uses those, and not the complex validation features.
attrs was first, dataclasses design is actually based on attrs! dataclasses is inferior in features and actually a shame because I see this ignorant attitude everywhere and I have to defend and explain attrs every time we need it.