Строки Python в типе расширения Cython - PullRequest
2 голосов
/ 29 июля 2011

У меня есть тип расширения (cdef class) со строковым полем.Я не знаю, как лучше объявить это.Предположим, следующий код:

cdef class Box:
    cdef char *_s
    cdef public str s1
    cdef public bytes s2

    property s:
        def __get__(self):
            cdef bytes py_string = self._s
            return py_string

    def __init__(self, s):
        cdef char *aux = s
        self._s = aux
        self.s1 = s
        self.s2 = s

И с использованием типа расширения:

>>> import test as t
>>> b = t.Box("hello")
>>> b.s
'hello!'
>>> b.s1
'hello'
>>> b.s2
'hello'
>>> type(b.s)
<type 'str'>
>>> type(b.s1)
<type 'str'>
>>> type(b.s2)
<type 'str'>

Они все работают, но я не уверен в таких вопросах, как сборка мусора и время жизни строкиобъекты.Мне не нравится подход char * + свойства, так как он самый неэффективный из трех.

Итак, мой вопрос: каков наилучший способ сделать это?Использование cdef public str s безопасно?

РЕДАКТИРОВАТЬ:

Ну cdef public str s, кажется, работает нормально, пока ссылка на Box где-то удерживается.

>>> gc.collect()
0
>>> gc.is_tracked(b)
True
>>> gc.get_referrers(b.s1)
[<test.Box object at 0x1a4f680>]
>>> gc.get_referrers(b.s2)
[<test.Box object at 0x1a4f680>]
>>> b.s1
'hello'

Спасибо.

1 Ответ

0 голосов
/ 09 августа 2011

Я не уверен, почему вас беспокоит сборщик мусора строки.

Если эта строка получена из другой программы C-space, просто скопируйте ее значение, чтобы объект Box владел им.

...