From 11ae047b00c68cc9456b78a4b43212371d2c8c91 Mon Sep 17 00:00:00 2001 From: Nando Florestan Date: Mon, 7 Jun 2021 13:56:16 +0200 Subject: [PATCH] Try (and fail) to add a defaultdict implementation This is not working yet. Firefox complains: Uncaught TypeError: meta is undefined __class__ org.transcrypt.__runtime__.py:4 collections.py:4 --- transcrypt/modules/collections.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 transcrypt/modules/collections.py diff --git a/transcrypt/modules/collections.py b/transcrypt/modules/collections.py new file mode 100644 index 00000000..1860fdb0 --- /dev/null +++ b/transcrypt/modules/collections.py @@ -0,0 +1,28 @@ +"""Python's collections module -- for Transcrypt.""" + + +class defaultdict(dict): + """Dictionary that takes a factory parameter and always returns a value.""" + + def __init__(self, default_factory=None, *args, **kwargs): # noqa + if not callable(default_factory) and default_factory is not None: + raise TypeError("first argument must be callable or None") + super().__init__(*args, **kwargs) + self.default_factory = default_factory + + def __repr__(self): + return "defaultdict({}, {})".format( + self.default_factory, super().__repr__(self) + ) + + def __missing__(self, key: str): + if self.default_factory is None: + raise KeyError(key) + self[key] = self.default_factory() + return super().__getitem__(key) + + def __getitem__(self, key: str): + try: + return super().__getitem__(key) + except KeyError: + return self.__missing__(key)