Source code for gevent.monkey._state
# -*- coding: utf-8 -*-
"""
State management and query functions for tracking and discovering what
has been patched.
"""
import logging
logger = logging.getLogger(__name__)
# maps module name -> {attribute name: original item}
# e.g. "time" -> {"sleep": built-in function sleep}
# NOT A PUBLIC API. However, third-party monkey-patchers may be using
# it? TODO: Provide better API for them.
saved:dict = {}
[docs]
def is_module_patched(mod_name):
"""
Check if a module has been replaced with a cooperative version.
:param str mod_name: The name of the standard library module,
e.g., ``'socket'``.
"""
return mod_name in saved
[docs]
def is_object_patched(mod_name, item_name):
"""
Check if an object in a module has been replaced with a
cooperative version.
:param str mod_name: The name of the standard library module,
e.g., ``'socket'``.
:param str item_name: The name of the attribute in the module,
e.g., ``'create_connection'``.
"""
return is_module_patched(mod_name) and item_name in saved[mod_name]
def is_anything_patched():
"""
Check if this module has done any patching in the current process.
This is currently only used in gevent tests.
Not currently a documented, public API, because I'm not convinced
it is 100% reliable in the event of third-party patch functions that
don't use ``saved``.
.. versionadded:: 21.1.0
"""
return bool(saved)
def _get_original(name, items):
d = saved.get(name, {})
values = []
module = None
for item in items:
if item in d:
values.append(d[item])
else:
if module is None:
module = __import__(name)
values.append(getattr(module, item))
return values
def _save(module, attr_name, item):
saved.setdefault(module.__name__, {}).setdefault(attr_name, item)