isinstance support tuple

This commit is contained in:
BLUELOVETH 2023-09-15 17:46:05 +08:00
parent b1df516bf1
commit 393302ae85
2 changed files with 26 additions and 0 deletions

View File

@ -121,6 +121,14 @@ void init_builtins(VM* _vm) {
}); });
_vm->bind_builtin_func<2>("isinstance", [](VM* vm, ArgsView args) { _vm->bind_builtin_func<2>("isinstance", [](VM* vm, ArgsView args) {
if(is_non_tagged_type(args[1], vm->tp_tuple)){
Tuple& types = _CAST(Tuple&, args[1]);
for(PyObject* type : types){
vm->check_non_tagged_type(type, vm->tp_type);
if(vm->isinstance(args[0], PK_OBJ_GET(Type, type))) return vm->True;
}
return vm->False;
}
vm->check_non_tagged_type(args[1], vm->tp_type); vm->check_non_tagged_type(args[1], vm->tp_type);
Type type = PK_OBJ_GET(Type, args[1]); Type type = PK_OBJ_GET(Type, args[1]);
return VAR(vm->isinstance(args[0], type)); return VAR(vm->isinstance(args[0], type));

View File

@ -77,6 +77,24 @@ assert isinstance(d, A)
assert isinstance(object, object) assert isinstance(object, object)
assert isinstance(type, object) assert isinstance(type, object)
assert isinstance(1, (float, int))
assert isinstance(1, (float, object))
assert not isinstance(1, (float, str))
assert isinstance(object, (int, type, float))
assert not isinstance(object, (int, float, str))
try:
isinstance(1, (1, 2))
exit(1)
except TypeError:
pass
try:
isinstance(1, 1)
exit(1)
except TypeError:
pass
class A: class A:
a = 1 a = 1
b = 2 b = 2