Commit 06b673a0 by Boris Staletic Committed by GitHub

Allow NULL value in pybind11_meta_setattro (#2629)

parent 3e4d54bc
...@@ -129,7 +129,7 @@ extern "C" inline int pybind11_meta_setattro(PyObject* obj, PyObject* name, PyOb ...@@ -129,7 +129,7 @@ extern "C" inline int pybind11_meta_setattro(PyObject* obj, PyObject* name, PyOb
// 2. `Type.static_prop = other_static_prop` --> setattro: replace existing `static_prop` // 2. `Type.static_prop = other_static_prop` --> setattro: replace existing `static_prop`
// 3. `Type.regular_attribute = value` --> setattro: regular attribute assignment // 3. `Type.regular_attribute = value` --> setattro: regular attribute assignment
const auto static_prop = (PyObject *) get_internals().static_property_type; const auto static_prop = (PyObject *) get_internals().static_property_type;
const auto call_descr_set = descr && PyObject_IsInstance(descr, static_prop) const auto call_descr_set = descr && value && PyObject_IsInstance(descr, static_prop)
&& !PyObject_IsInstance(value, static_prop); && !PyObject_IsInstance(value, static_prop);
if (call_descr_set) { if (call_descr_set) {
// Call `static_property.__set__()` instead of replacing the `static_property`. // Call `static_property.__set__()` instead of replacing the `static_property`.
......
...@@ -171,6 +171,19 @@ def test_static_properties(): ...@@ -171,6 +171,19 @@ def test_static_properties():
assert m.TestPropertiesOverride().def_readonly == 99 assert m.TestPropertiesOverride().def_readonly == 99
assert m.TestPropertiesOverride.def_readonly_static == 99 assert m.TestPropertiesOverride.def_readonly_static == 99
# Only static attributes can be deleted
del m.TestPropertiesOverride.def_readonly_static
assert (
hasattr(m.TestPropertiesOverride, "def_readonly_static")
and m.TestPropertiesOverride.def_readonly_static
is m.TestProperties.def_readonly_static
)
assert "def_readonly_static" not in m.TestPropertiesOverride.__dict__
properties_override = m.TestPropertiesOverride()
with pytest.raises(AttributeError) as excinfo:
del properties_override.def_readonly
assert "can't delete attribute" in str(excinfo.value)
def test_static_cls(): def test_static_cls():
"""Static property getter and setters expect the type object as the their only argument""" """Static property getter and setters expect the type object as the their only argument"""
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment