From 35fa31fa6705d6b6866b5f5361b833e19339713b Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Wed, 26 Jul 2017 13:07:38 -0400 Subject: [PATCH] Use inspect.getmro to inspect the mro. Alternate implementation to that proposed in #1092. --- CHANGES.rst | 6 ++++++ pkg_resources/__init__.py | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 9af6001baa..8412557b09 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,9 @@ +v36.2.4 +------- + +* #1092: ``pkg_resources`` now uses ``inspect.getmro`` to + resolve classes in method resolution order. + v36.2.3 ------- diff --git a/pkg_resources/__init__.py b/pkg_resources/__init__.py index 51b4749261..f6666968b4 100644 --- a/pkg_resources/__init__.py +++ b/pkg_resources/__init__.py @@ -37,6 +37,7 @@ import tempfile import textwrap import itertools +import inspect from pkgutil import get_importer try: @@ -2939,20 +2940,20 @@ def parse(s): return req -def _get_mro(cls): - """Get an mro for a type or classic class""" - if not isinstance(cls, type): - - class cls(cls, object): - pass - - return cls.__mro__[1:] - return cls.__mro__ +def _always_object(classes): + """ + Ensure object appears in the mro even + for old-style classes. + """ + if object not in classes: + return classes + (object,) + return classes def _find_adapter(registry, ob): """Return an adapter factory for `ob` from `registry`""" - for t in _get_mro(getattr(ob, '__class__', type(ob))): + types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) + for t in types: if t in registry: return registry[t]