У меня есть тип расширения (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'
Спасибо.