Skip to content

Commit

Permalink
Add explanation of singletons in unions to PEP484 (#240)
Browse files Browse the repository at this point in the history
  • Loading branch information
ilevkivskyi authored and gvanrossum committed Jul 5, 2016
1 parent e55cbc4 commit 28c3d32
Showing 1 changed file with 60 additions and 0 deletions.
60 changes: 60 additions & 0 deletions pep-0484.txt
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,66 @@ This is equivalent to::

def handle_employee(e: Optional[Employee] = None) -> None: ...


Support for singleton types in unions
-------------------------------------

A singleton instance is frequently used to mark some special condition,
in particular in situations where ``None`` is also a valid value
for a variable. Example::

_empty = object()

def func(x=_empty):
if x is _empty: # default argument value
return 0
elif x is None: # argument was provided and it's None
return 1
else:
return x * 2

To allow precise typing in such situations, the user should use
the ``Union`` type in conjuction with the ``enum.Enum`` class provided
by the standard library, so that type errors can be caught statically::

from typing import Union
from enum import Enum

class Empty(Enum):
token = 0
_empty = Empty.token

def func(x: Union[int, None, Empty] = _empty) -> int:

boom = x * 42 # This fails type check

if x is _empty:
return 0
elif x is None:
return 1
else: # At this point typechecker knows that x can only have type int
return x * 2

Since the subclasses of ``Enum`` cannot be further subclassed,
the type of variable ``x`` can be statically inferred in all branches
of the above example. The same approach is applicable if more than one
singleton object is needed: one can use an enumeration that has more than
one value::

class Reason(Enum):
timeout = 1
error = 2

def process(response: Union[str, Reason] = '') -> str:
if response is Reason.timeout:
return 'TIMEOUT'
elif response is Reason.error:
return 'ERROR'
else:
# response can be only str, all other possible values exhausted
return 'PROCESSED: ' + response


The ``Any`` type
----------------

Expand Down

0 comments on commit 28c3d32

Please sign in to comment.