On Tue, May 25, 2021 at 10:09 PM Eric Nieuwland
<eric.nieuwl...@gmail.com> wrote:
>
>
> To add to the suggestions already given in this thread I dug into code I 
> wrote some time ago. Offered as an inspiration.
>
> === missing.py ===
>
> from typing import Any
>
> def MISSING(klass: Any) -> Any: """ create a sentinel to indicate a missing 
> instance of a class :param klass: the class of which an instance is missing 
> :return: missing class object """ g = globals() missing_klass_name = 
> f"_MISSING_{klass.__module__}_{klass.__name__}_MISSING_" if 
> missing_klass_name not in g: g[missing_klass_name] = type( 
> missing_klass_name, (klass,), { "__repr__": lambda x: 
> f"MISSING({klass.__name__})", } ) return g[missing_klass_name]()
>
> ===
>
> and as a demo:
>
> === demo_missing.py ===
>
> import pickle
>
> from missing import MISSING
>
> x = MISSING(str) y = "bar" print(f"{x!r} == {y!r}: {x == y}") print(f"{x!r} 
> is {y!r}: {x is y}") # MISSING(str) == 'bar': False # MISSING(str) is 'bar': 
> False
>
> with open("object.pickled", "wb") as f: pickle.dump(x, f) with 
> open("object.pickled", "rb") as f: y = pickle.load(f) print(f"{x!r} == {y!r}: 
> {x == y}") print(f"{x!r} is {y!r}: {x is y}") # MISSING(str) == MISSING(str): 
> True # MISSING(str) is MISSING(str): False
>
> def foo(a: int = MISSING(int), b: int = MISSING(int)): print(f"{a=} 
> {isinstance(a, int)}") print(f"{b=} {isinstance(b, int)}") print(f"{a!r} == 
> {b!r}: {a == b}") print(f"{a!r} is {b!r}: {a is b}")
>
> foo() # a=MISSING(int) True # b=MISSING(int) True # MISSING(int) == 
> MISSING(int): True # MISSING(int) is MISSING(int): False
>
> foo(1) # a=1 True # b=MISSING(int) True # 1 == MISSING(int): False # 1 is 
> MISSING(int): False
>
> class Test: ...
>
> t = MISSING(Test) print(f"{t=}") # t=MISSING(Test)
>
> ===

Wow, that's... terribly clever. Thanks for sharing this!

- Tal
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/AEUHYDXJF3PVGGZ5WET5AMLKNO3STQJP/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to