[英]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
所有的a
, aA
, ab
和abB
實際上都是類,但是你可以像處理命名空間一樣處理a
和ab
- 並且從不實際實例化它們
虛擬類的技巧很好,但不允許:
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.