pybind11
pybind11 copied to clipboard
[BUG]: implementing __str__ on an enum turn the name attribute into a method
Required prerequisites
- [X] Make sure you've read the documentation. Your issue may be addressed there.
- [X] Search the issue tracker and Discussions to verify that this hasn't already been reported. +1 or comment there if it has.
- [X] Consider asking first in the Gitter chat room or in a Discussion.
What version (or hash if on master) of pybind11 are you using?
2.6.2
Problem description
When adding a .def(__str__, ...) on an instance of py::enum_ the name method of the enum members turns from an attribute into a method (i.e. you need parentheses to call it). Seems to happen both with and without a py::prepend().
Also this creates warnings when generating documentation with sphinx, because the docstring for name will show all the overloads for __str__. Those will contain *args and **kwargs which will be considered unclosed emphasis and strong emphasis characters.
Reproducible example code
enum class TestType
{
Unknown = -1,
RandomForest,
NeuralNetworkLegacy,
NeuralNetwork
};
py::enum_<TestType>(mod, "TestType")
.value("NeuralNetwork", TestType::NeuralNetwork)
.value("NeuralNetworkLegacy", TestType::NeuralNetworkLegacy)
.value("RandomForest", TestType::RandomForest)
.def("__str__", [](const TestType& t) { return "Hello"; }, py::prepend());
Then in Python:
TestType.NeuralNetwork.name
Out[1]: <bound method PyCapsule.name of <TestType.NeuralNetwork: 2>>
Is this a regression? Put the last known working version here if it is.
2.5
Also, I found this weird piece. Notice how both methods are called name. They are not identical, though when comparing them with is

The way we have enums implemented currently is a major source of bugs / odd behavior. Open to PRs that improve the situation.
Are there any beginner-friendly bugs from where I can start with?