mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
type.__dict__ (#5957)
This commit is contained in:
1 parent
16aaad7aeb
commit
8ab7aa2c6b
2 files changed
+31
-14
No files matched your search
@@ -595,3 +595,15 @@ assert repr(my_repr_func).startswith("<function my_repr_func at 0x")
|
||||
|
||||
# https://github.com/RustPython/RustPython/issues/3100
|
||||
assert issubclass(types.BuiltinMethodType, types.BuiltinFunctionType)
|
||||
|
||||
assert type.__dict__["__dict__"].__objclass__ is type
|
||||
assert (
|
||||
type(type(type.__dict__["__dict__"]).__objclass__).__name__ == "member_descriptor"
|
||||
)
|
||||
|
||||
|
||||
class A(type):
|
||||
pass
|
||||
|
||||
|
||||
assert "__dict__" not in A.__dict__
|
||||
+19
-14
@@ -936,9 +936,9 @@ impl Constructor for PyType {
|
||||
return Err(vm.new_value_error("type name must not contain null characters"));
|
||||
}
|
||||
|
||||
let (metatype, base, bases) = if bases.is_empty() {
|
||||
let (metatype, base, bases, base_is_type) = if bases.is_empty() {
|
||||
let base = vm.ctx.types.object_type.to_owned();
|
||||
(metatype, base.clone(), vec![base])
|
||||
(metatype, base.clone(), vec![base], false)
|
||||
} else {
|
||||
let bases = bases
|
||||
.iter()
|
||||
@@ -972,8 +972,9 @@ impl Constructor for PyType {
|
||||
};
|
||||
|
||||
let base = best_base(&bases, vm)?;
|
||||
let base_is_type = base.is(vm.ctx.types.type_type);
|
||||
|
||||
(metatype, base.to_owned(), bases)
|
||||
(metatype, base.to_owned(), bases, base_is_type)
|
||||
};
|
||||
|
||||
let qualname = dict
|
||||
@@ -1021,17 +1022,21 @@ impl Constructor for PyType {
|
||||
// All *classes* should have a dict. Exceptions are *instances* of
|
||||
// classes that define __slots__ and instances of built-in classes
|
||||
// (with exceptions, e.g function)
|
||||
let __dict__ = identifier!(vm, __dict__);
|
||||
attributes.entry(__dict__).or_insert_with(|| {
|
||||
vm.ctx
|
||||
.new_static_getset(
|
||||
"__dict__",
|
||||
vm.ctx.types.type_type,
|
||||
subtype_get_dict,
|
||||
subtype_set_dict,
|
||||
)
|
||||
.into()
|
||||
});
|
||||
// Also, type subclasses don't need their own __dict__ descriptor
|
||||
// since they inherit it from type
|
||||
if !base_is_type {
|
||||
let __dict__ = identifier!(vm, __dict__);
|
||||
attributes.entry(__dict__).or_insert_with(|| {
|
||||
vm.ctx
|
||||
.new_static_getset(
|
||||
"__dict__",
|
||||
vm.ctx.types.type_type,
|
||||
subtype_get_dict,
|
||||
subtype_set_dict,
|
||||
)
|
||||
.into()
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: Flags is currently initialized with HAS_DICT. Should be
|
||||
// updated when __slots__ are supported (toggling the flag off if
|
||||
|
||||
Reference in new issue
Block a user