首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建boost-python嵌套命名空间

创建boost-python嵌套命名空间
EN

Stack Overflow用户
提问于 2011-10-14 17:24:05
回答 2查看 5.3K关注 0票数 6

使用boost python,我需要创建嵌套的命名空间。

假设我有以下cpp类结构:

代码语言:javascript
复制
namespace a
{
    class A{...}
    namespace b
    {
         class B{...}
    }
}

显而易见的解决方案不起作用:

代码语言:javascript
复制
BOOST_PYTHON_MODULE( a ) {
    boost::python::class_<a::A>("A")
     ...
    ;
    BOOST_PYTHON_MODULE(b){
        boost::python::class_<a::b::B>("B")
        ...
    ;
    }
}

它会导致编译时错误:linkage specification must be at global scope

有没有办法将可以从Python访问的类B声明为a.b.B

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-18 06:18:22

你想要的是一个boost::python::scope

Python没有“命名空间”的概念,但是你可以像使用命名空间一样使用一个类:

代码语言:javascript
复制
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/scope.hpp>
using namespace boost::python;

namespace a
{
    class A{};

    namespace b
    {
         class B{};
    }
}

class DummyA{};
class DummyB{};

BOOST_PYTHON_MODULE(mymodule)
{
    // Change the current scope 
    scope a
        = class_<DummyA>("a")
        ;

    // Define a class A in the current scope, a
    class_<a::A>("A")
        //.def("somemethod", &a::A::method)
        ;

    // Change the scope again, a.b:
    scope b
        = class_<DummyB>("b")
        ;

    class_<a::b::B>("B")
        //.def("somemethod", &a::b::B::method)
        ;
}

然后在python中,您需要:

代码语言:javascript
复制
#!/usr/bin/env python
import mylib

print mylib.a,
print mylib.a.A
print mylib.a.b
print mylib.a.b.B

所有的aa.Aa.ba.b.B实际上都是类,但是您可以像对待名称空间一样对待aa.b --而且永远不会实例化它们

票数 12
EN

Stack Overflow用户

发布于 2013-06-19 17:58:07

使用虚拟类的技巧是很好的,但不允许:

代码语言:javascript
复制
import mylib.a
from mylib.a.b import B

因此,请改用PyImport_AddModule()。你可以在下面的文章中找到完整的例子:Packages in Python extension modules,由Vadim Macagon编写。

简而言之:

代码语言:javascript
复制
namespace py = boost::python;
std::string nested_name = py::extract<std::string>(py::scope().attr("__name__") + ".nested");
py::object nested_module(py::handle<>(py::borrowed(PyImport_AddModule(nested_name.c_str()))));
py::scope().attr("nested") = nested_module;
py::scope parent = nested_module;
py::class_<a::A>("A")...
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7765596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档