12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- """
- Module defining global singleton classes.
- This module raises a RuntimeError if an attempt to reload it is made. In that
- way the identities of the classes defined here are fixed and will remain so
- even if numpy itself is reloaded. In particular, a function like the following
- will still work correctly after numpy is reloaded::
- def foo(arg=np._NoValue):
- if arg is np._NoValue:
- ...
- That was not the case when the singleton classes were defined in the numpy
- ``__init__.py`` file. See gh-7844 for a discussion of the reload problem that
- motivated this module.
- """
- __ALL__ = [
- 'ModuleDeprecationWarning', 'VisibleDeprecationWarning', '_NoValue'
- ]
- # Disallow reloading this module so as to preserve the identities of the
- # classes defined here.
- if '_is_loaded' in globals():
- raise RuntimeError('Reloading numpy._globals is not allowed')
- _is_loaded = True
- class ModuleDeprecationWarning(DeprecationWarning):
- """Module deprecation warning.
- The nose tester turns ordinary Deprecation warnings into test failures.
- That makes it hard to deprecate whole modules, because they get
- imported by default. So this is a special Deprecation warning that the
- nose tester will let pass without making tests fail.
- """
- ModuleDeprecationWarning.__module__ = 'numpy'
- class VisibleDeprecationWarning(UserWarning):
- """Visible deprecation warning.
- By default, python will not show deprecation warnings, so this class
- can be used when a very visible warning is helpful, for example because
- the usage is most likely a user bug.
- """
- VisibleDeprecationWarning.__module__ = 'numpy'
- class _NoValueType:
- """Special keyword value.
- The instance of this class may be used as the default value assigned to a
- keyword if no other obvious default (e.g., `None`) is suitable,
- Common reasons for using this keyword are:
- - A new keyword is added to a function, and that function forwards its
- inputs to another function or method which can be defined outside of
- NumPy. For example, ``np.std(x)`` calls ``x.std``, so when a ``keepdims``
- keyword was added that could only be forwarded if the user explicitly
- specified ``keepdims``; downstream array libraries may not have added
- the same keyword, so adding ``x.std(..., keepdims=keepdims)``
- unconditionally could have broken previously working code.
- - A keyword is being deprecated, and a deprecation warning must only be
- emitted when the keyword is used.
- """
- __instance = None
- def __new__(cls):
- # ensure that only one instance exists
- if not cls.__instance:
- cls.__instance = super().__new__(cls)
- return cls.__instance
- # needed for python 2 to preserve identity through a pickle
- def __reduce__(self):
- return (self.__class__, ())
- def __repr__(self):
- return "<no value>"
- _NoValue = _NoValueType()
|