Remix.run Logo
ansgri 7 months ago

Why? I thought one should prefer immutability. As for typed dicts.. yes, I’m mostly stuck on old python versions, nice reminder.

int_19h 7 months ago | parent | next [-]

In general, preferring immutability is great. In Python specifically, it can be hard to pull off given that e.g. something as basic as dict does not have a standard immutable equivalent. You inevitably have to rely on conventions - basically saying "this is supposed to be immutable" rather than enforcing it.

maleldil 7 months ago | parent | prev | next [-]

You can use TypedDict from `typing_extensions` if your version doesn't have it. You can use a lot of the newer stuff from there, too, especially if you enable `__future__.annotations`.

How old is your Python, though? TypedDict is from 3.8. That was 5 years ago.

throwaway2037 7 months ago | parent | prev [-]

You can use:

    > @dataclass(frozen=True)
to create an immutable data class.
maleldil 7 months ago | parent [-]

While that works (and I use it extensively), it's a bit hacky. You have to use `object.__setattr__` to set attributes in `__init__` or `__post_init__`, which looks so wrong.

maxbond 7 months ago | parent | next [-]

I think the cleaner alternative would be to use a static or class method as an alternative constructor and use the init the dataclass decorator provides for you. Eg something like:

    @dataclass(frozen=True)
    class Foo:
        bar: int
        baz: str

        @classmethod
        def new(cls, bar: int) -> "Foo":
            baz = calculate_baz(bar)
            return cls(bar, baz)

    foo = Foo.new(10)
throwaway2037 7 months ago | parent | prev [-]

What is wrong with a static factory method?