Python Cython:用户如何定义C++-类可以使用吗?
赛顿似乎对如何包装保持沉默 例如,当以下c++代码打印Python Cython:用户如何定义C++-类可以使用吗?,python,c++,cython,Python,C++,Cython,赛顿似乎对如何包装保持沉默 例如,当以下c++代码打印1(即true)时: #包括 结构X{ 运算符bool()常量{return true;} }; int main(){ X; std::cout仅查看bool案例: 我不认为print(x)无论如何都应该将其转换为bool。print(x)寻找到Python对象的转换(好的,bool可以转换为Python对象,但这有点间接)只有在相当有限的情况下,比如在if语句中,Cython通常遵循Python行为作为规则 def testit():
1
(即true
)时:
#包括
结构X{
运算符bool()常量{return true;}
};
int main(){
X;
std::cout仅查看bool
案例:
我不认为print(x)
无论如何都应该将其转换为bool。print(x)
寻找到Python对象的转换(好的,bool
可以转换为Python对象,但这有点间接)只有在相当有限的情况下,比如在if
语句中,Cython通常遵循Python行为作为规则
def testit():
cdef X x
if x:
print("is True")
else:
print("if False")
运算符bool()
给出错误
“运算符”不是类型标识符
我假设它需要返回的类型,就像每个其他C++函数一样(即,对于<代码>操作符< /代码>没有特殊的情况)。这是工作的(排序…参见下一点…):
这就是语法
>P>但是,您需要从文件顶部的LIbCPP C导入Boo./COD>执行<代码>,以获得C++ <代码> BOOL 类型。
如果您查看转换后的源代码,如果x:
,它将作为
__pyx_t_1 = __pyx_v_x.operator bool();
if (__pyx_t_1) {
操作符bool
被显式调用(这对于Cython来说非常常见),但使用的位置正确,因此Cython清楚地了解它的用途。类似地,如果在不定义操作符的情况下执行if x:
,则会出现错误
类型为“X”的对象没有属性“运算符bool”
再次说明,这是Cython的一个特点
<> P.>这里显然有一点文档失败,如果语法在未来更接近C++,我不会感到惊讶。
对于更一般的情况:目前,您无法定义其他运算符。仅查看
bool
情况:
print(x)
无论如何都应该将其转换为bool。print(x)
寻找到Python对象的转换(好的,bool
可以转换为Python对象,但这有点间接)只有在相当有限的情况下,比如在if
语句中,Cython通常遵循Python行为作为规则
def testit():
cdef X x
if x:
print("is True")
else:
print("if False")
运算符bool()
给出错误
“运算符”不是类型标识符
我假设它需要返回的类型,就像每个其他C++函数一样(即,对于<代码>操作符< /代码>没有特殊的情况)。这是工作的(排序…参见下一点…):
这就是语法__pyx_t_1 = __pyx_v_x.operator bool();
if (__pyx_t_1) {
操作符bool
被显式调用(这对于Cython来说非常常见),但使用的位置正确,因此Cython清楚地了解它的用途。类似地,如果在不定义操作符的情况下执行if x:
,则会出现错误
类型为“X”的对象没有属性“运算符bool”
再次说明,这是Cython的一个特点
<> P.>这里显然有一点文档失败,如果语法在未来更接近C++,我不会感到惊讶。
对于更一般的情况:目前,您无法定义其他运算符。这只是对的一些补充 如前所述,Cython只支持
运算符bool
——其他用户定义的转换,如:
cdef CPPX类:
int运算符int()
将导致错误消息,如
尚不支持重载运算符“int”
一种可能的解决方法不是包装用户定义的转换,而是在需要时使用显式转换。例如:
%%cython-+-a
cdef外部源*:
"""
结构X{
//隐式转换
运算符int()常量{return 42;}
};
"""
cdef CPPx类:
传递#离开运算符int()
def testit():
cdefx;
打印(x)
它编译并打印42
一次testit
被调用。Cython在这里不干预显式强制转换
具有讽刺意味的是,上述解决方法不适用于操作符bool()
:
%%cython-+-a
cdef外部源*:
"""
结构X{
//隐式转换
运算符bool()常量{return true;}
};
"""
cdef CPPx类:
忽略运算符bool()
def testit():
cdefx;
如果x:
打印(真)
其他:
打印(假)
导致错误消息:
类型为“X”的对象没有属性“运算符bool”
显然,此检查是运算符bool()
-支持包的一部分
但是,可以使用cast toint
而不是cast tobool/bint
来实现以下目标:
。。。
如果x:
...
但是,应优先使用运算符bool()
简言之:
bint操作符bool()
包装C++的操作符bool()
这只是一些补充 如前所述,Cython只支持
运算符bool
——其他用户定义的转换,如:
cdef CPPX类:
int运算符int()
将导致错误消息,如
尚不支持重载运算符“int”
阿宝