4 ms·
Interesting to find this here, if someone else haven't followed Python3, there is also NamedTuple which for all purposes is like immutable record: from typ
by Ciantic 5y ago
Interesting to find this here, if someone else haven't followed Python3, there is also NamedTuple which for all purposes is like immutable record:
from typing import NamedTuple
class Coord(NamedTuple):
x: int
y: int
I would prefer immutable records over dataclasses on many occasions.
- 331c8c71 5y agoLong gone are the days of "There should be one-- and preferably only one --obvious way to do it" from PEP 20 ("Python Zen") and it's a pity IMO.
- q3k 5y agoYeah, Python is basically slowly becoming a TypeScript. On one one hand: yay types. On the other hand… yeah, this isn’t Python anymore. What used to be a fairly simple language with some well known quirks evolved into an ungrokable katamari of every single possible language feature, a duct taped mush of pieces from different puzzle sets. I guess it’s a victim of its own success. I just wish it stayed good old, Python, and people would just use different languages for different needs instead of needing one general purpose language for everything.
- Banana699 5y agoI don't see how this is duct-tabing, decorators are very straightforward syntax sugar over Python's everything-is-an-object mentality @decorator some_func is simply some_func = decorator(some_func) There is no C++style "Here is 100 more arcane rules and 1000 exceptions and meta-rules that govern their interaction and application". It's all consistent additions to the language that does nothing but abstract out what you could do by hand but more verbose-ly and error-prone-ly. In fact, nothing in the above comments except type annotations are "language features" at all, they are libraries, and not even implicitly imported at that.
- formerly_proven 5y agoAnd almost nothing of these are actually language features but in the library.
- angelzen 5y ago"Python is basically slowly becoming a TypeScript." If only.
- JoBrad 5y agoPart of the reason I wrote my last app in Node/Typescript is because Python’s typing was such crap and MyPy wasn’t mature enough at the time.
- vsmhn 5y agoNamedTuple works great for a lot of cases, but not always. For example, when dealing with attribute defaults for mutable collections. Dataclasses have a `default_factory` that is used in these occasions.
- BurningFrog 5y agoYou can pass frozen=True to the @dataclass decoratot.
- lcnmrn 5y agoNamedTuples work with and without type hints, but Dataclasses only work with type hints: https://subreply.com/reply/lsk https://subreply.com/reply/lsk
- ericvsmith 5y agodataclasses author here. That's not true. You can use make_dataclass the same way you can use namedtuple: >>> from dataclasses import make_dataclass >>> A = make_dataclass("A", ["x", "y", "z"]) >>> A(1, 2, 3) A(x=1, y=2, z=3) It is true that if you want to use @dataclass you have to use annotations, just the way you do with typing.NamedTuple. But as others have noted, the annotation is mostly ignored. [edited for formatting]
- lcnmrn 5y agoCan you assign defaults with make_dataclass() but no types?
- pletnes 5y agoDataclasses can optionally be «frozen» / immutable IIRC. Namedtuple is intended for when you need a tuple. I’ve used it for e.g numpy array shapes, so image data has names (imgshape.width instead of imgshape[1]). There, you need an actual tuple (or subclass of tuple if you want).
- woadwarrior01 5y agoThe `eval()` in the namedtuple factory function[1] makes it a bit kludgy, IMO. [1]: https://github.com/python/cpython/blob/3.10/Lib/collections/__init__.py#L414 https://github.com/python/cpython/blob/3.10/Lib/collections/...
- JoBrad 5y agoIf I recall correctly, NamedTuple doesn’t support calculated properties, but a Data class does (as the first example shows).