我正在尝试在Cython中编写一个函数来处理一串字符串。在下面的代码中,我试图将一个unicode str
对象列表(在Python 3中)转换为char*
的表,然后使用该表来搜索子字符串。
我找到了Python 2 here的解决方案,但是此解决方案依赖于仅在Python 2中可用的对象PyString_AsString
,而在Python 3中我们应该使用PyUnicode_AsUTF8
,我发现了here。当我尝试使用PyUnicode_AsUTF8
时,我遇到了这个错误:
:31:16:' PyUnicode_AsUTF8'不是常量,变量或函数标识符
我几乎没有想法。无论我尝试什么都会导致某种错误。
代码
import cython
from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
from cpython.string cimport PyUnicode_AsUTF8
from libc.string cimport strstr
@cython.boundscheck(False)
def start(itsstr, tokens):
cdef size_t s
cdef size_t t
cdef size_t ns = len(itsstr)
cdef size_t nt = len(tokens)
cdef const char** t_str = _char_table(itsstr, ns)
cdef const char** t_tok = _char_table(tokens, nt)
cdef unicode x
for s in xrange(ns):
for t in xrange(nt):
if strstr(t_str[s], t_tok[t]):
x = itsstr[s]
PyMem_Free(t_str)
PyMem_Free(t_tok)
cdef const char** _char_table(s, const size_t n):
cdef char** t = <char**>PyMem_Malloc(n * sizeof(char*))
cdef size_t i = 0
for i in xrange(n):
temp = PyUnicode_AsUTF8(s[i])
t[i] = temp
return t
答案 0 :(得分:1)
Cython不会将函数PyUnicode_AsUTF8
包装在cpython.string中。所以你必须自己做:
#instead of from cpython.string cimport PyUnicode_AsUTF8
cdef extern from "Python.h":
const char* PyUnicode_AsUTF8(object unicode)
实际上,在Python 3.7之前的版本中它是char * PyUnicode_AsUTF8(...)
,但是在它之前使用const也不会因旧版本而干扰Cython。