簡體   English   中英

創建boost-python嵌套命名空間

[英]create boost-python nested namespace

使用boost python我需要創建嵌套的命名空間。

假設我有以下cpp類結構:

namespace a
{
    class A{...}
    namespace b
    {
         class B{...}
    }
}

明顯的解決方案不起作用:

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作為abB

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

Python沒有“名稱空間”的概念,但你可以使用類非常類似於命名空間:

#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中,你有:

#!/usr/bin/env python
import mylib

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

所有的aaAababB實際上都是類,但是你可以像處理命名空間一樣處理aab - 並且從不實際實例化它們

虛擬類的技巧很好,但不允許:

import mylib.a
from mylib.a.b import B

因此,請使用PyImport_AddModule()。 您可以在以下文章中找到完整的功能示例:Vadim Macagon的Python擴展模塊中的包。

簡而言之:

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")...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM