Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to · python/cpython@ec569b7 (original) (raw)

`@@ -75,15 +75,21 @@ class B(object):

`

75

75

`pass

`

76

76

`b = B()

`

77

77

`self.assertEqual(issubclass(B, A), False)

`

``

78

`+

self.assertEqual(issubclass(B, (A,)), False)

`

78

79

`self.assertEqual(isinstance(b, A), False)

`

``

80

`+

self.assertEqual(isinstance(b, (A,)), False)

`

79

81

`A.register(B)

`

80

82

`self.assertEqual(issubclass(B, A), True)

`

``

83

`+

self.assertEqual(issubclass(B, (A,)), True)

`

81

84

`self.assertEqual(isinstance(b, A), True)

`

``

85

`+

self.assertEqual(isinstance(b, (A,)), True)

`

82

86

`class C(B):

`

83

87

`pass

`

84

88

`c = C()

`

85

89

`self.assertEqual(issubclass(C, A), True)

`

``

90

`+

self.assertEqual(issubclass(C, (A,)), True)

`

86

91

`self.assertEqual(isinstance(c, A), True)

`

``

92

`+

self.assertEqual(isinstance(c, (A,)), True)

`

87

93

``

88

94

`def test_isinstance_invalidation(self):

`

89

95

`class A(metaclass=abc.ABCMeta):

`

`@@ -92,22 +98,29 @@ class B:

`

92

98

`pass

`

93

99

`b = B()

`

94

100

`self.assertEqual(isinstance(b, A), False)

`

``

101

`+

self.assertEqual(isinstance(b, (A,)), False)

`

95

102

`A.register(B)

`

96

103

`self.assertEqual(isinstance(b, A), True)

`

``

104

`+

self.assertEqual(isinstance(b, (A,)), True)

`

97

105

``

98

106

`def test_registration_builtins(self):

`

99

107

`class A(metaclass=abc.ABCMeta):

`

100

108

`pass

`

101

109

`A.register(int)

`

102

110

`self.assertEqual(isinstance(42, A), True)

`

``

111

`+

self.assertEqual(isinstance(42, (A,)), True)

`

103

112

`self.assertEqual(issubclass(int, A), True)

`

``

113

`+

self.assertEqual(issubclass(int, (A,)), True)

`

104

114

`class B(A):

`

105

115

`pass

`

106

116

`B.register(str)

`

107

117

`class C(str): pass

`

108

118

`self.assertEqual(isinstance("", A), True)

`

``

119

`+

self.assertEqual(isinstance("", (A,)), True)

`

109

120

`self.assertEqual(issubclass(str, A), True)

`

``

121

`+

self.assertEqual(issubclass(str, (A,)), True)

`

110

122

`self.assertEqual(issubclass(C, A), True)

`

``

123

`+

self.assertEqual(issubclass(C, (A,)), True)

`

111

124

``

112

125

`def test_registration_edge_cases(self):

`

113

126

`class A(metaclass=abc.ABCMeta):

`

`@@ -130,29 +143,40 @@ def test_registration_transitiveness(self):

`

130

143

`class A(metaclass=abc.ABCMeta):

`

131

144

`pass

`

132

145

`self.failUnless(issubclass(A, A))

`

``

146

`+

self.failUnless(issubclass(A, (A,)))

`

133

147

`class B(metaclass=abc.ABCMeta):

`

134

148

`pass

`

135

149

`self.failIf(issubclass(A, B))

`

``

150

`+

self.failIf(issubclass(A, (B,)))

`

136

151

`self.failIf(issubclass(B, A))

`

``

152

`+

self.failIf(issubclass(B, (A,)))

`

137

153

`class C(metaclass=abc.ABCMeta):

`

138

154

`pass

`

139

155

`A.register(B)

`

140

156

`class B1(B):

`

141

157

`pass

`

142

158

`self.failUnless(issubclass(B1, A))

`

``

159

`+

self.failUnless(issubclass(B1, (A,)))

`

143

160

`class C1(C):

`

144

161

`pass

`

145

162

`B1.register(C1)

`

146

163

`self.failIf(issubclass(C, B))

`

``

164

`+

self.failIf(issubclass(C, (B,)))

`

147

165

`self.failIf(issubclass(C, B1))

`

``

166

`+

self.failIf(issubclass(C, (B1,)))

`

148

167

`self.failUnless(issubclass(C1, A))

`

``

168

`+

self.failUnless(issubclass(C1, (A,)))

`

149

169

`self.failUnless(issubclass(C1, B))

`

``

170

`+

self.failUnless(issubclass(C1, (B,)))

`

150

171

`self.failUnless(issubclass(C1, B1))

`

``

172

`+

self.failUnless(issubclass(C1, (B1,)))

`

151

173

`C1.register(int)

`

152

174

`class MyInt(int):

`

153

175

`pass

`

154

176

`self.failUnless(issubclass(MyInt, A))

`

``

177

`+

self.failUnless(issubclass(MyInt, (A,)))

`

155

178

`self.failUnless(isinstance(42, A))

`

``

179

`+

self.failUnless(isinstance(42, (A,)))

`

156

180

``

157

181

`def test_all_new_methods_are_called(self):

`

158

182

`class A(metaclass=abc.ABCMeta):

`