Skip to content

Commit 2110d2d

Browse files
enum: add missing Enum.value property (#2739)
* enum: Add Enum.value property * simplify * address review
1 parent b7dfe5c commit 2110d2d

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

include/pybind11/pybind11.h

+1
Original file line numberDiff line numberDiff line change
@@ -1731,6 +1731,7 @@ template <typename Type> class enum_ : public class_<Type> {
17311731
m_base.init(is_arithmetic, is_convertible);
17321732

17331733
def(init([](Scalar i) { return static_cast<Type>(i); }), arg("value"));
1734+
def_property_readonly("value", [](Type value) { return (Scalar) value; });
17341735
def("__int__", [](Type value) { return (Scalar) value; });
17351736
#if PY_MAJOR_VERSION < 3
17361737
def("__long__", [](Type value) { return (Scalar) value; });

tests/test_enum.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,24 @@ def test_unscoped_enum():
1313

1414
# name property
1515
assert m.UnscopedEnum.EOne.name == "EOne"
16+
assert m.UnscopedEnum.EOne.value == 1
1617
assert m.UnscopedEnum.ETwo.name == "ETwo"
17-
assert m.EOne.name == "EOne"
18-
# name readonly
18+
assert m.UnscopedEnum.ETwo.value == 2
19+
assert m.EOne is m.UnscopedEnum.EOne
20+
# name, value readonly
1921
with pytest.raises(AttributeError):
2022
m.UnscopedEnum.EOne.name = ""
21-
# name returns a copy
22-
foo = m.UnscopedEnum.EOne.name
23-
foo = "bar"
23+
with pytest.raises(AttributeError):
24+
m.UnscopedEnum.EOne.value = 10
25+
# name, value returns a copy
26+
# TODO: Neither the name nor value tests actually check against aliasing.
27+
# Use a mutable type that has reference semantics.
28+
nonaliased_name = m.UnscopedEnum.EOne.name
29+
nonaliased_name = "bar" # noqa: F841
2430
assert m.UnscopedEnum.EOne.name == "EOne"
31+
nonaliased_value = m.UnscopedEnum.EOne.value
32+
nonaliased_value = 10 # noqa: F841
33+
assert m.UnscopedEnum.EOne.value == 1
2534

2635
# __members__ property
2736
assert m.UnscopedEnum.__members__ == {
@@ -33,8 +42,8 @@ def test_unscoped_enum():
3342
with pytest.raises(AttributeError):
3443
m.UnscopedEnum.__members__ = {}
3544
# __members__ returns a copy
36-
foo = m.UnscopedEnum.__members__
37-
foo["bar"] = "baz"
45+
nonaliased_members = m.UnscopedEnum.__members__
46+
nonaliased_members["bar"] = "baz"
3847
assert m.UnscopedEnum.__members__ == {
3948
"EOne": m.UnscopedEnum.EOne,
4049
"ETwo": m.UnscopedEnum.ETwo,

0 commit comments

Comments
 (0)