mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-22 05:05:11 +00:00
Allow NULL value in pybind11_meta_setattro (#2629)
This commit is contained in:
parent
3e4d54bc01
commit
06b673a0da
@ -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():
|
|||||||
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"""
|
||||||
|
Loading…
Reference in New Issue
Block a user