Skip to content

Commit a5050eb

Browse files
committed
Make property return itself if invoke by class binding
1 parent 6c3a402 commit a5050eb

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

tests/snippets/property.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ def foo(self):
1616
assert f.foo == 100
1717
assert f.foo == 101
1818

19+
assert type(Fubar.foo) is property
20+
1921

2022
null_property = property()
2123
assert type(null_property) is property
@@ -45,3 +47,5 @@ def foo(self):
4547
assert p1.getter(None).fget == "a"
4648
assert p1.setter(None).fset == "b"
4749
assert p1.deleter(None).fdel == "c"
50+
51+
assert p1.__get__(None, object) is p1

vm/src/obj/objproperty.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::function::IntoPyNativeFunc;
66
use crate::function::OptionalArg;
77
use crate::obj::objstr::PyStringRef;
88
use crate::obj::objtype::PyClassRef;
9-
use crate::pyobject::{PyContext, PyObject, PyObjectRef, PyRef, PyResult, PyValue};
9+
use crate::pyobject::{IdProtocol, PyContext, PyObject, PyObjectRef, PyRef, PyResult, PyValue};
1010
use crate::vm::VirtualMachine;
1111

1212
/// Read-only property, doesn't have __set__ or __delete__
@@ -25,7 +25,11 @@ pub type PyReadOnlyPropertyRef = PyRef<PyReadOnlyProperty>;
2525

2626
impl PyReadOnlyPropertyRef {
2727
fn get(self, obj: PyObjectRef, _owner: PyClassRef, vm: &mut VirtualMachine) -> PyResult {
28-
vm.invoke(self.getter.clone(), obj)
28+
if obj.is(&vm.ctx.none) {
29+
Ok(self.into_object())
30+
} else {
31+
vm.invoke(self.getter.clone(), obj)
32+
}
2933
}
3034
}
3135

@@ -66,7 +70,11 @@ impl PyPropertyRef {
6670

6771
fn get(self, obj: PyObjectRef, _owner: PyClassRef, vm: &mut VirtualMachine) -> PyResult {
6872
if let Some(getter) = self.getter.as_ref() {
69-
vm.invoke(getter.clone(), obj)
73+
if obj.is(&vm.ctx.none) {
74+
Ok(self.into_object())
75+
} else {
76+
vm.invoke(getter.clone(), obj)
77+
}
7078
} else {
7179
Err(vm.new_attribute_error("unreadable attribute".to_string()))
7280
}

0 commit comments

Comments
 (0)