_compat.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. import sys
  2. from functools import partial
  3. def find_entrypoints(group_name: str):
  4. """
  5. Find entrypoints of a given group using either `importlib.metadata` or the
  6. older `pkg_resources` mechanism.
  7. Yields tuples of the entrypoint name and a callable function that will
  8. load the actual entrypoint.
  9. """
  10. if sys.version_info >= (3, 10):
  11. # "Changed in version 3.10: importlib.metadata is no longer provisional."
  12. try:
  13. from importlib.metadata import entry_points
  14. except ImportError:
  15. pass
  16. else:
  17. eps = entry_points(group=group_name)
  18. # Only do this if this implementation of `importlib.metadata` is
  19. # modern enough to not return a dict.
  20. if not isinstance(eps, dict):
  21. for entry_point in eps:
  22. yield (entry_point.name, entry_point.load)
  23. return
  24. try:
  25. from pkg_resources import working_set
  26. except ImportError:
  27. pass
  28. else:
  29. for entry_point in working_set.iter_entry_points(group_name):
  30. yield (entry_point.name, partial(entry_point.load, require=True))