gpt4 book ai didi

python - 如何从 cython 公开静态 constexpr

转载 作者:行者123 更新时间:2023-11-30 05:08:12 26 4
gpt4 key购买 nike

我需要将以下演示示例从 cpp 包装到 cython 以便在 Python 中使用

class Foo1 : public MFoo<unsigned int> { 
public:
constexpr Foo1(unsigned int val) : MFoo{val} {}
}
};

class Foo{
public:
static constexpr Foo1 any {0};
static constexpr Foo1 one {1<<1};
static constexpr Foo1 two {1<<2};
};

这是我目前拥有的文件.pxd

cdef extern from "../MFoo.hpp":
cdef cppclass MFoo:
pass

cdef extern from "../header.hpp":
cdef cppclass Foo1(MFoo):
pass

cdef extern from "../header.hpp":
cdef cppclass Foo:
###@staticmethod
Foo1 _any "Foo::any"
Foo1 _one "Foo::one"
Foo1 _two "Foo::two"
###any=_any
### I also need to link my cpp definitions of any,one and two
###to cython file but I am facing Error:Python object cannot be declared extern

我的文件.pyx

def Bar(self,PyFoo1 abc)
return file.Bar(######) # how would I call something like Foo::one

我需要知道如何用 cython 包装它。我正在使用 How to expose a constexpr to Cython?这很相似但仍然不是很有用

最佳答案

您的主要问题是 Cython 不提供表达 C++ 静态成员变量的方法。要解决这个问题,您可以将它们放在全局范围内并使用字符串来确保生成正确的 C++ 代码。 constexpr 是无关紧要的 - Cython 不需要知道它。

我已经创建了一个比您的稍微简化的最小示例(例如,它省略了您没有提供定义的不相关模板类):

class C {
public:
constexpr C(unsigned int) {}
};

class D {
public:
static constexpr C any {0};
static constexpr C one {1<<1};
static constexpr C two {1<<2};
};

inline void bar(const C&) {}

在 cython 中:

cdef extern from "whatever.hpp":
cdef cppclass C:
pass
cdef cppclass D:
pass
C any "D::any"
C one "D::one"
C two "D::two"

void bar(const C&)

请注意,我没有将 anyonetwo 放在 D 中,但要确保字符串创建 C++ 代码 D::any


我认为还有第二个问题是关于如何从 Python 调用 bar。显然有很多选项,但一个简单的方法是传递一个字符串,并使用一个 Cython 函数将字符串与 C++ 值相匹配:

# except NULL allows Cython to signal an error to the calling function
cdef const C* get_C_instance(s) except NULL:
if s=="any":
return &any
elif s=="one":
return &one
elif s=="two":
return &two
raise ValueError("Unrecognised string {0}".format(s))

def py_bar(s):
return bar(get_C_instance(s)[0])

这不是创建 Python 接口(interface)的唯一解决方案——您可以创建一个包含 C 的包装类,并为其创建名为 any 的实例,一个两个例如。

关于python - 如何从 cython 公开静态 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46962636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com