Интересно, как правильно определить атрибуты в расширении python, сгенерированном с помощью PyCxx. В настоящее время я создал подкласс Py::PythonClass
как в официальном примере. Я добавил behaviors().supportGetattro();
в функции инициализации и создал простое переопределение
Py::Object getattro( const Py::String &name_ )
{
std::string name( name_.as_std_string( "utf-8" ) );
if( name == "name" )
{
return m_name;
}
else
{
return genericGetAttro( name_ );
}
}
Все идет нормально. В python я получаю правильное значение с obj.name
, но единственное, что делает меня ненасытным, это то, что при вызове dir(obj)
атрибут name
не попадает в список. Как я могу это изменить?
Барри Скотт, разработчик PyCXX, любезно предоставил простое решение. Фокус в том, что python запрашивает значение __members__
в getattr( const char *_name )
при вызове dir()
. В этом случае можно вернуть объект Py::List
содержащий имена атрибутов в виде строк.
tp_getset
когдаtp_getset
не используется.PyGetSetDef()
. Единственным препятствием является получениеtp_getset
переменнойtp_getset
(защищено), но теперь я определяю подклассPythonType
как вспомогательный.