summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Crosley <timothy.crosley@gmail.com>2014-01-14 22:48:46 -0500
committerTimothy Crosley <timothy.crosley@gmail.com>2014-01-14 22:48:46 -0500
commit2dec9f7593a437a0bf12463f824f83a425d9356b (patch)
tree07d379c44d1c424c308eda7287c8148c19638cf1
parent9a3c908a363fd4ebd3f9f818bd3e7fb381945526 (diff)
downloadpies-2dec9f7593a437a0bf12463f824f83a425d9356b.tar.gz
Fix small incompatibility with Python 2.6
-rw-r--r--pies/_utils.py31
-rw-r--r--pies/overrides.py23
2 files changed, 44 insertions, 10 deletions
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