Ошибка при использовании "PyUnicode_AsUTF8" - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь написать функцию на Cython для обработки большого количества строк.В приведенном ниже коде я пытаюсь преобразовать список объектов Unicode str (в Python 3) в таблицу char*, которая затем используется для поиска подстрок.

Я нашелрешение для Python 2 здесь , но это решение зависит от объекта PyString_AsString, который доступен только в Python 2, тогда как в Python 3 мы должны использовать PyUnicode_AsUTF8, который я обнаружил около здесь .Когда я пытался использовать 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

1 Ответ

0 голосов
/ 10 июня 2018

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для более старых версий.

...