赛通的文档 https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html#overloading-operators似乎对如何用户定义的转换 https://en.cppreference.com/w/cpp/language/cast_operator可以包裹。
例如,虽然以下 C++ 代码打印1
(i.e. true
, 住在这里 https://ideone.com/FC9YW1):
#include <iostream>
struct X{
operator bool() const{ return true;}
};
int main() {
X x;
std::cout << x << "\n";
}
它在 Cython 中的“等效项”:
%%cython -+
cdef extern from *:
"""
struct X {
//implicit conversion
operator bool() const { return true; }
};
"""
cdef cppclass X:
operator bool() # ERROR HERE
def testit():
cdef X x;
print(x) # implicit cast, "should" print True
没有被 cythonized 并显示以下错误消息(在标记为ERROR HERE
):
“operator”不是类型标识符
如何从 Cython 使用用户定义的转换?如果不能,解决方法是什么?
只看bool
case:
-
我不相信print(x)
无论如何应该将其转换为 bool 。print(x)
寻找到 Python 对象的转换(好吧,bool
可以转换为Python对象,但有点间接)。 Python 本身使用__bool__
(__nonzero__
在Python 2)仅在相当有限的情况下,例如在if
声明,Cython 通常遵循 Python 行为作为规则。因此我将测试代码更改为
def testit():
cdef X x
if x:
print("is True")
else:
print("if False")
-
operator bool()
给出错误
“operator”不是类型标识符
我认为它需要像其他 C++ 函数一样从返回类型开始(即没有特殊情况operator
)。这有效(有点......参见下一点......):
bool operator bool()
这是一个语法在 Cython 的测试套件中进行了测试 https://github.com/cython/cython/blob/aaad38f78580193892ff4b4883bb28d5793c6b9e/tests/run/cpp_operators.pyx#L142.
但是,您确实需要这样做from libcpp cimport bool
在文件顶部获取 C++bool
type.
如果您查看转换后的源if x:
它最终是
__pyx_t_1 = __pyx_v_x.operator bool();
if (__pyx_t_1) {
operator bool
被显式调用(这对于 Cython 来说很常见),但在正确的位置使用,因此 Cython 清楚地理解它的用途。同样,如果你这样做if x:
如果没有定义运算符,您会收到错误
类型“X”的对象没有属性“operator bool”
再次表明这是 Cython 的一个功能。
这里显然存在一些文档错误,如果将来语法发生变化以更接近 C++,我可能不会 100% 感到惊讶。
对于更一般的情况:看起来像bool是唯一受支持的类型转换运算符 https://github.com/cython/cython/blob/5a8c984403ce73ac29f9e8b7c78ee5f0f4c608a3/Cython/Compiler/Parsing.py#L2834目前,因此您无法定义其他运算符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)