Cython 不编译 void 函数 - "empty declarator"
Cython not compiling void function - "empty declarator"
我在 foo.cpp
中定义了一个非常简单的 c++ class:
class Foo
{
int x;
public:
Foo()
{}
Foo(int _x)
: x ( _x )
{}
int getX() { return x; }
void print()
{ std::cout << "Foo { " << x << "}" << std::endl; }
};
在尝试用 cython 包装它时,我使用以下声明创建了 foo.pxd
:
cdef extern from "foo.cpp":
cdef cppclass Foo:
Foo() except +
Foo(int) except +
int x
int getX()
void print()
但是,在尝试构建它并将其 cimport
放入我的 pyx
源文件时,它给了我以下编译错误:
Error compiling Cython file:
------------------------------------------------------------
...
cdef cppclass Foo:
Foo() except +
Foo(int) except +
int x
int getX()
void print()
^
------------------------------------------------------------
foo.pxd:9:13: Empty declarator
Error compiling Cython file:
------------------------------------------------------------
...
cdef cppclass Foo:
Foo() except +
Foo(int) except +
int x
int getX()
void print()
^
------------------------------------------------------------
foo.pxd:9:13: Syntax error in C variable declaration
我试图遵循 this tutorial,但它似乎对我不起作用。即使将其修改为 Foo::print
方法采用整数参数 y
,并将 foo.pxd
更新为 void print(int)
,我也会得到完全相同的错误。
我可能做错了什么,为什么我会出现这种行为?
答案实际上很简单,但了解起来非常有用。成员本身的名字是问题所在,而不是我在 foo.pxd
中声明它的方式。鉴于 print
是一个内置的 python 函数,它似乎与之冲突;将名称更改为任何非内置 method/function/type 或关键字的名称应该可以解决问题。请注意,Python、Cython 和 C/C++ keywords/functions 都可能以相同的方式与此冲突。
@DavidW 的回答(我已接受)更简洁地阐明了问题。我的解决方案有效,但列出的解释无效。
问题不是 print
是一个内置的函数。没关系。您可以毫无问题地覆盖内置函数的名称。
list = 1 # perfectly valid code; (but may confuse future users)
问题是 print
是内置的 关键字 。这是因为 Cython 在读取 .pyx 时默认使用 Python 2 语法(暂时)。要解决此问题,请使用 language_level=3
compiler directive.
Cython 还可以在 Cython 中使用与 C/C++ 中不同的名称来修复此类名称冲突。你可以改用它
cdef extern from "foo.cpp":
cdef cppclass Foo:
...
void cpp_print "print"()
这意味着 Cython 中的 cpp_print
被转换为 C++ 中的 print
。
我在 foo.cpp
中定义了一个非常简单的 c++ class:
class Foo
{
int x;
public:
Foo()
{}
Foo(int _x)
: x ( _x )
{}
int getX() { return x; }
void print()
{ std::cout << "Foo { " << x << "}" << std::endl; }
};
在尝试用 cython 包装它时,我使用以下声明创建了 foo.pxd
:
cdef extern from "foo.cpp":
cdef cppclass Foo:
Foo() except +
Foo(int) except +
int x
int getX()
void print()
但是,在尝试构建它并将其 cimport
放入我的 pyx
源文件时,它给了我以下编译错误:
Error compiling Cython file:
------------------------------------------------------------
...
cdef cppclass Foo:
Foo() except +
Foo(int) except +
int x
int getX()
void print()
^
------------------------------------------------------------
foo.pxd:9:13: Empty declarator
Error compiling Cython file:
------------------------------------------------------------
...
cdef cppclass Foo:
Foo() except +
Foo(int) except +
int x
int getX()
void print()
^
------------------------------------------------------------
foo.pxd:9:13: Syntax error in C variable declaration
我试图遵循 this tutorial,但它似乎对我不起作用。即使将其修改为 Foo::print
方法采用整数参数 y
,并将 foo.pxd
更新为 void print(int)
,我也会得到完全相同的错误。
我可能做错了什么,为什么我会出现这种行为?
答案实际上很简单,但了解起来非常有用。成员本身的名字是问题所在,而不是我在 foo.pxd
中声明它的方式。鉴于 print
是一个内置的 python 函数,它似乎与之冲突;将名称更改为任何非内置 method/function/type 或关键字的名称应该可以解决问题。请注意,Python、Cython 和 C/C++ keywords/functions 都可能以相同的方式与此冲突。
@DavidW 的回答(我已接受)更简洁地阐明了问题。我的解决方案有效,但列出的解释无效。
问题不是 print
是一个内置的函数。没关系。您可以毫无问题地覆盖内置函数的名称。
list = 1 # perfectly valid code; (but may confuse future users)
问题是 print
是内置的 关键字 。这是因为 Cython 在读取 .pyx 时默认使用 Python 2 语法(暂时)。要解决此问题,请使用 language_level=3
compiler directive.
Cython 还可以在 Cython 中使用与 C/C++ 中不同的名称来修复此类名称冲突。你可以改用它
cdef extern from "foo.cpp":
cdef cppclass Foo:
...
void cpp_print "print"()
这意味着 Cython 中的 cpp_print
被转换为 C++ 中的 print
。