forked from RustPython/RustPython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathisinstance.py
More file actions
54 lines (30 loc) · 1.07 KB
/
isinstance.py
File metadata and controls
54 lines (30 loc) · 1.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Regular:
pass
assert isinstance(Regular(), Regular)
class MCNotInstanceOf(type):
def __instancecheck__(self, instance):
return False
class NotInstanceOf(metaclass=MCNotInstanceOf):
pass
class InheritedNotInstanceOf(NotInstanceOf):
pass
assert not isinstance(Regular(), NotInstanceOf)
assert not isinstance(1, NotInstanceOf)
# weird cpython behaviour if exact match then isinstance return true
assert isinstance(NotInstanceOf(), NotInstanceOf)
assert not NotInstanceOf.__instancecheck__(NotInstanceOf())
assert not isinstance(InheritedNotInstanceOf(), NotInstanceOf)
class MCAlwaysInstanceOf(type):
def __instancecheck__(self, instance):
return True
class AlwaysInstanceOf(metaclass=MCAlwaysInstanceOf):
pass
assert isinstance(AlwaysInstanceOf(), AlwaysInstanceOf)
assert isinstance(Regular(), AlwaysInstanceOf)
assert isinstance(1, AlwaysInstanceOf)
class MCReturnInt(type):
def __instancecheck__(self, instance):
return 3
class ReturnInt(metaclass=MCReturnInt):
pass
assert isinstance("a", ReturnInt) is True