From c4e3b13dc2cf510d9824474da9435644ce821c62 Mon Sep 17 00:00:00 2001 From: Jakob van Santen Date: Tue, 25 Apr 2023 16:29:12 +0200 Subject: [PATCH] Use qualname for enum repr --- src/object/enum.cpp | 14 ++++++++++++-- test/nested.cpp | 10 ++++++++++ test/nested.py | 9 +++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/object/enum.cpp b/src/object/enum.cpp index 5753b32e..94df8e4a 100644 --- a/src/object/enum.cpp +++ b/src/object/enum.cpp @@ -49,7 +49,9 @@ extern "C" if (!self->name) { return -#if PY_VERSION_HEX >= 0x03000000 +#if PY_VERSION_HEX >= 0x03030000 + PyUnicode_FromFormat("%S.%S(%ld)", mod, ((PyHeapTypeObject*)(self_->ob_type))->ht_qualname, PyLong_AsLong(self_)); +#elif PY_VERSION_HEX >= 0x03000000 PyUnicode_FromFormat("%S.%s(%ld)", mod, self_->ob_type->tp_name, PyLong_AsLong(self_)); #else PyString_FromFormat("%s.%s(%ld)", PyString_AsString(mod), self_->ob_type->tp_name, PyInt_AS_LONG(self_)); @@ -62,7 +64,9 @@ extern "C" return 0; return -#if PY_VERSION_HEX >= 0x03000000 +#if PY_VERSION_HEX >= 0x03030000 + PyUnicode_FromFormat("%S.%S.%S", mod, ((PyHeapTypeObject*)(self_->ob_type))->ht_qualname, name); +#elif PY_VERSION_HEX >= 0x03000000 PyUnicode_FromFormat("%S.%s.%S", mod, self_->ob_type->tp_name, name); #else PyString_FromFormat("%s.%s.%s", @@ -145,6 +149,7 @@ static PyTypeObject enum_type_object = { }; object module_prefix(); +object qualname(const char *name); namespace { @@ -175,6 +180,11 @@ namespace object module_name = module_prefix(); if (module_name) d["__module__"] = module_name; +#if PY_VERSION_HEX >= 0x03030000 + object q = qualname(name); + if (q) + d["__qualname__"] = q; +#endif if (doc) d["__doc__"] = doc; diff --git a/test/nested.cpp b/test/nested.cpp index b807c8bd..3a0d05e5 100644 --- a/test/nested.cpp +++ b/test/nested.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include "test_class.hpp" @@ -17,6 +18,8 @@ typedef test_class<> X; typedef test_class<1> Y; +enum color { red = 0, blue = 1, green = 2 }; + std::ostream& operator<<(std::ostream& s, X const& x) { return s << x.value(); @@ -45,6 +48,13 @@ BOOST_PYTHON_MODULE(nested_ext) class_("Y", init()) .def(str(self)) ; + + // so will the enum `color` + enum_("color") + .value("red", red) + .value("green", green) + .value("blue", blue) + ; } // The generated docstring will use the fully-qualified name of Y diff --git a/test/nested.py b/test/nested.py index 3d97208b..f53e7af5 100644 --- a/test/nested.py +++ b/test/nested.py @@ -22,6 +22,15 @@ >>> X.Y.__name__ 'Y' + >>> X.color.__qualname__ + 'X.color' + + >>> repr(X.color.red) + 'nested_ext.X.color.red' + + >>> repr(X.color(1)) + 'nested_ext.X.color(1)' + >>> test_function.__doc__.strip().split('\\n')[0] 'test_function( (X)arg1, (X.Y)arg2) -> None :'