typeutils - Type handling

Python’s built-in functools module builds several useful utilities on top of Python’s first-class function support. typeutils attempts to do the same for metaprogramming with types and instances.

class boltons.typeutils.classproperty(fn)[source]

Much like a property, but the wrapped get function is a class method. For simplicity, only read-only properties are implemented.

boltons.typeutils.get_all_subclasses(cls)[source]

Recursively finds and returns a list of all types inherited from cls.

>>> class A(object):
...     pass
...
>>> class B(A):
...     pass
...
>>> class C(B):
...     pass
...
>>> class D(A):
...     pass
...
>>> [t.__name__ for t in get_all_subclasses(A)]
['B', 'D', 'C']
>>> [t.__name__ for t in get_all_subclasses(B)]
['C']
boltons.typeutils.issubclass(subclass, baseclass)[source]

Just like the built-in issubclass(), this function checks whether subclass is inherited from baseclass. Unlike the built-in function, this issubclass will simply return False if either argument is not suitable (e.g., if subclass is not an instance of type), instead of raising TypeError.

Parameters:
  • subclass (type) – The target class to check.

  • baseclass (type) – The base class subclass will be checked against.

>>> class MyObject(object): pass
...
>>> issubclass(MyObject, object)  # always a fun fact
True
>>> issubclass('hi', 'friend')
False
boltons.typeutils.make_sentinel(name='_MISSING', var_name=None)[source]

Creates and returns a new instance of a new class, suitable for usage as a “sentinel”, a kind of singleton often used to indicate a value is missing when None is a valid input.

Parameters:
  • name (str) – Name of the Sentinel

  • var_name (str) – Set this name to the name of the variable in its respective module enable pickleability. Note: pickleable sentinels should be global constants at the top level of their module.

>>> make_sentinel(var_name='_MISSING')
_MISSING

The most common use cases here in boltons are as default values for optional function arguments, partly because of its less-confusing appearance in automatically generated documentation. Sentinels also function well as placeholders in queues and linked lists.

Note

By design, additional calls to make_sentinel with the same values will not produce equivalent objects.

>>> make_sentinel('TEST') == make_sentinel('TEST')
False
>>> type(make_sentinel('TEST')) == type(make_sentinel('TEST'))
False