创建 boost-python 嵌套命名空间

发布于 2024-12-10 04:01:53 字数 508 浏览 0 评论 0原文

使用 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")
        ...
    ;
    }
}

它会导致编译时错误:链接规范必须在全局范围内

有没有办法将可以从 Python 访问的类 B 声明为 <代码>abB?

Using boost python I need create nested namespace.

Assume I have following cpp class structure:

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

Obvious solution not work:

BOOST_PYTHON_MODULE( a ) {
    boost::python::class_<a::A>("A")
     ...
    ;
    BOOST_PYTHON_MODULE(b){
        boost::python::class_<a::b::B>("B")
        ...
    ;
    }
}

It causes compile-time error: linkage specification must be at global scope

Is there any way to declare class B that would be accessed from Python as a.b.B?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

秋叶绚丽 2024-12-17 04:01:53

你想要的是 boost::python: :范围

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

All a, aA, ababB 实际上是类,但您可以将 aab 就像命名空间一样 - 并且永远不会真正实例化它们

What you want is a boost::python::scope.

Python has no concept of 'namespaces', but you can use a class very much like a namespace:

#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)
        ;
}

Then in python, you have:

#!/usr/bin/env python
import mylib

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

All a, a.A, a.b and a.b.B are actually classes, but you can treat a and a.b just like namespaces - and never actually instantiate them

攒一口袋星星 2024-12-17 04:01:53

虚拟类的技巧非常好,但不允许:

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

因此,请使用 PyImport_AddModule()。您可以在以下文章中找到功能齐全的示例: Python 扩展模块中的包,作者:Vadim Macagon。

简而言之:

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

The trick with dummy classes is quite fine, but doesn't allow:

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

So, instead, use PyImport_AddModule(). You may find full featured examples in the following article: Packages in Python extension modules, by Vadim Macagon.

In short:

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")...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文