Skip to content

Instantly share code, notes, and snippets.

@rkhullar
Created April 25, 2023 22:16
Show Gist options
  • Save rkhullar/31b5ede1221880a7414f3f0c463cdfb3 to your computer and use it in GitHub Desktop.
Save rkhullar/31b5ede1221880a7414f3f0c463cdfb3 to your computer and use it in GitHub Desktop.
frozen dataclass with mutable field
from dataclasses import dataclass, field
from typing import Generic, TypeVar
T = TypeVar('T')
@dataclass
class Proxy(Generic[T]):
_data: T
def set(self, data: T) -> None:
self._data = data
def get(self) -> T:
return self._data
def __repr__(self) -> str:
return str(self._data)
@classmethod
def field(cls, default: T = None, **kwargs):
return field(init=False, default_factory=lambda: Proxy(_data=default), **kwargs)
@dataclass(frozen=True)
class Person:
name: str
message: Proxy[str] = Proxy.field(default='x')
if __name__ == '__main__':
p = Person(name='me')
p.message.set('hello world')
print(p)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment