Skip to content

Commit bce10e3

Browse files
committed
Derive all other future.types metaclasses from BaseNewObject and modify BaseNewObject __instancecheck__ to attempt to get test_types_isinstance_newobject() working
1 parent 49b036d commit bce10e3

File tree

7 files changed

+19
-18
lines changed

7 files changed

+19
-18
lines changed

future/tests/test_object.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ class C(A):
162162
self.assertFalse(isinstance(b, C))
163163
self.assertTrue(isinstance(c, C))
164164

165-
@unittest.expectedFailure
166165
def test_types_isinstance_newobject(self):
167166
a = list()
168167
b = dict()
@@ -191,8 +190,8 @@ class G(F):
191190
g = G()
192191
self.assertTrue(isinstance(g, object))
193192

194-
def h():
195-
return
193+
class H():
194+
pass
196195
h = H()
197196
self.assertTrue(isinstance(h, object))
198197

future/types/newbytes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from future.utils import istext, isbytes, PY3, with_metaclass
1313
from future.types import no, issubset
14-
from future.types.newobject import newobject
14+
from future.types.newobject import newobject, BaseNewObject
1515

1616

1717
_builtin_bytes = bytes
@@ -21,7 +21,7 @@
2121
unicode = str
2222

2323

24-
class BaseNewBytes(type):
24+
class BaseNewBytes(BaseNewObject):
2525
def __instancecheck__(cls, instance):
2626
if cls == newbytes:
2727
return isinstance(instance, _builtin_bytes)

future/types/newdict.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
import sys
2020

2121
from future.utils import with_metaclass
22-
from future.types.newobject import newobject
22+
from future.types.newobject import newobject, BaseNewObject
2323

2424

2525
_builtin_dict = dict
2626
ver = sys.version_info[:2]
2727

2828

29-
class BaseNewDict(type):
29+
class BaseNewDict(BaseNewObject):
3030
def __instancecheck__(cls, instance):
3131
if cls == newdict:
3232
return isinstance(instance, _builtin_dict)

future/types/newint.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
import collections
1212

1313
from future.types.newbytes import newbytes
14-
from future.types.newobject import newobject
14+
from future.types.newobject import newobject, BaseNewObject
1515
from future.utils import PY3, isint, istext, isbytes, with_metaclass, native
1616

1717

1818
if PY3:
1919
long = int
2020

2121

22-
class BaseNewInt(type):
22+
class BaseNewInt(BaseNewObject):
2323
def __instancecheck__(cls, instance):
2424
if cls == newint:
2525
# Special case for Py2 short or long int

future/types/newlist.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
import copy
1717

1818
from future.utils import with_metaclass
19-
from future.types.newobject import newobject
19+
from future.types.newobject import newobject, BaseNewObject
2020

2121

2222
_builtin_list = list
2323
ver = sys.version_info[:2]
2424

2525

26-
class BaseNewList(type):
26+
class BaseNewList(BaseNewObject):
2727
def __instancecheck__(cls, instance):
2828
if cls == newlist:
2929
return isinstance(instance, _builtin_list)

future/types/newobject.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ def __iter__(self):
4646
ver = sys.version_info[:2]
4747

4848

49-
# Dodgy: this messes up isinstance checks with subclasses of newobject
50-
# class BaseNewObject(type):
51-
# def __instancecheck__(cls, instance):
52-
# return isinstance(instance, _builtin_object)
49+
class BaseNewObject(type):
50+
def __instancecheck__(cls, instance):
51+
if cls == newobject:
52+
return isinstance(instance, _builtin_object)
53+
else:
54+
return issubclass(instance.__class__, cls)
5355

5456

55-
class newobject(_builtin_object):
57+
class newobject(with_metaclass(BaseNewObject, _builtin_object)):
5658
"""
5759
A magical object class that provides Python 2 compatibility methods::
5860
next

future/types/newstr.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@
4545

4646
from future.utils import PY3, istext, with_metaclass, isnewbytes
4747
from future.types import no, issubset
48-
from future.types.newobject import newobject
48+
from future.types.newobject import newobject, BaseNewObject
4949

5050

5151
if PY3:
5252
# We'll probably never use newstr on Py3 anyway...
5353
unicode = str
5454

5555

56-
class BaseNewStr(type):
56+
class BaseNewStr(BaseNewObject):
5757
def __instancecheck__(cls, instance):
5858
if cls == newstr:
5959
return isinstance(instance, unicode)

0 commit comments

Comments
 (0)