From 2dec9f7593a437a0bf12463f824f83a425d9356b Mon Sep 17 00:00:00 2001 From: Timothy Crosley Date: Tue, 14 Jan 2014 22:48:46 -0500 Subject: Fix small incompatibility with Python 2.6 --- pies/_utils.py | 31 +++++++++++++++++++++++++------ pies/overrides.py | 23 +++++++++++++++++++---- 2 files changed, 44 insertions(+), 10 deletions(-) (limited to 'pies') diff --git a/pies/_utils.py b/pies/_utils.py index f64b6b6..12a8987 100644 --- a/pies/_utils.py +++ b/pies/_utils.py @@ -19,6 +19,8 @@ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import abc +import sys def with_metaclass(meta, *bases): @@ -53,11 +55,28 @@ def unmodified_isinstance(*bases): it allows calls against passed in built in instances to pass even if there not a subclass """ - class UnmodifiedIsInstance(type): - @classmethod - def __instancecheck__(cls, instance): - if cls.__name__ in (str(base.__name__) for base in bases): - return isinstance(instance, bases) - return type.__instancecheck__(cls, instance) + class UnmodifiedIsInstance(object): + if sys.version_info[0] == 2 and sys.version_info[1] <= 6: + + @classmethod + def __instancecheck__(cls, instance): + if cls.__name__ in (str(base.__name__) for base in bases): + return isinstance(instance, bases) + + subclass = getattr(instance, '__class__', None) + subtype = type(instance) + if subtype is abc._InstanceType: + subtype = subclass + if subtype is subclass or subclass is None: + return cls.__subclasscheck__(subtype) + return (cls.__subclasscheck__(subclass) or cls.__subclasscheck__(subtype)) + else: + @classmethod + def __instancecheck__(cls, instance): + if cls.__name__ in (str(base.__name__) for base in bases): + return isinstance(instance, bases) + + return type.__instancecheck__(cls, instance) return with_metaclass(UnmodifiedIsInstance, *bases) + diff --git a/pies/overrides.py b/pies/overrides.py index 5577e59..c826897 100644 --- a/pies/overrides.py +++ b/pies/overrides.py @@ -21,7 +21,9 @@ """ from __future__ import absolute_import +import abc import functools +import sys from numbers import Integral from ._utils import unmodified_isinstance, with_metaclass @@ -205,10 +207,23 @@ else: dct['__str__'] = lambda self: self.__unicode__().encode('utf-8') return type.__new__(cls, name, bases, dct) - def __instancecheck__(cls, instance): - if cls.__name__ == "object": - return isinstance(instance, native_object) - return type.__instancecheck__(cls, instance) + if sys.version_info[1] <= 6: + def __instancecheck__(cls, instance): + if cls.__name__ == "object": + return isinstance(instance, native_object) + + subclass = getattr(instance, '__class__', None) + subtype = type(instance) + if subtype is abc._InstanceType: + subtype = subclass + if subtype is subclass or subclass is None: + return cls.__subclasscheck__(subtype) + return (cls.__subclasscheck__(subclass) or cls.__subclasscheck__(subtype)) + else: + def __instancecheck__(cls, instance): + if cls.__name__ == "object": + return isinstance(instance, native_object) + return type.__instancecheck__(cls, instance) class object(with_metaclass(FixStr, object)): pass -- cgit v1.2.1