Reputation: 6993
There is an idiom in Python to do something like,
UNDEFINED = object()
def do_something(value=UNDEFINED):
if value is UNDEFINED:
do1()
else if value is None:
do2()
else:
do3()
The point being that None
may be a valid value and UNDEFINED
causes some other default behavior.
The mypy signature would then be:
def do_something(value=int|None|object):
...
Which seems kind of pointless since everything is an object.
Literal[UNDEFINED]
isn't a valid, either.
The best I can come up with so far is:
class _Undefined:
pass
UNDEFINED = _Undefined()
and
def do_something(value=int|None|_Undefined):
...
It's close, but introduces corner cases of someone passing _Undefined()
(making a new instance) and means I'd be better off using isinstance
rather than value is UNDEFINED
as the old idiom encourages.
Is there a new idiom emerging to do this with mypy and type annotations?
edit:
@drooze points out Handling conditional logic + sentinel value with mypy ... which does seem to address this!
Upvotes: 0
Views: 84