Недавно я играл с Cython для ускорения, но мой проект наследует модуль, который имеет метод copy()
, который использует deepcopy()
. Я попытался реализовать deepcopy()
в переопределенной версии copy()
, и я думал, что у меня это работает, но похоже, что это больше не работает.
TypeError: object.__new__(cython_binding_builtin_function_or_method) is not safe,
use cython_binding_builtin_function_or_method.__new__()
Это происходит в python/lib/copy_reg.py здесь:
return cls.__new__(cls, *args)
Я здесь на Python 2.7. Возможно ли, что более новая версия Python возвращается с deepcopy()
безопасным способом? Я также на последней версии Cython, 0.15.1.
Update3
Обратите внимание, что я удалил предыдущие обновления, чтобы сделать это максимально простым.
Ok! Я думаю, что нашел несовместимость, но я действительно не знаю, что с этим делать.
class CythonClass:
def __init__(self):
self._handle = self._handles.get("handle_method")
def call_handle(self):
self._handle(self)
def handle_method(self):
print "I'm a little handle!"
handles = {"handle_method", handle_method}
Затем в моем основном приложении:
from cython1 import CythonClass
from copy import deepcopy
if __name__ == "__main__":
gc1 = CythonClass()
gc1.call_handle()
gc2 = deepcopy(gc1)
Я получаю:
I'm a little handle!
Traceback (most recent call last):
File "cythontest.py", line 8, in <module>
gc2 = deepcopy(gc1)
File "C:\python26\lib\copy.py", line 162, in deepcopy
y = copier(x, memo)
File "C:\python26\lib\copy.py", line 292, in _deepcopy_inst
state = deepcopy(state, memo)
File "C:\python26\lib\copy.py", line 162, in deepcopy
y = copier(x, memo)
File "C:\python26\lib\copy.py", line 255, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:\python26\lib\copy.py", line 189, in deepcopy
y = _reconstruct(x, rv, 1, memo)
File "C:\python26\lib\copy.py", line 323, in _reconstruct
y = callable(*args)
File "C:\python26\lib\copy_reg.py", line 93, in __newobj__
return cls.__new__(cls, *args)
TypeError: object.__new__(cython_binding_builtin_function_or_method) is not safe, use cython_binding_builtin_function_or_method.__new__()
Ключ - это ссылка на функцию /handle:
handles = {"handle_method", handle_method}
Если я не включаю ссылку на метод/функцию, Cython не будет взорваться во время глубокой печати. Если я включаю один, ему не нравится, как deepcopy/copy_reg копирует ссылку.
Любые идеи, кроме ссылок на методы/функции? У меня есть немного распутывания, если это простой ответ. (на котором я уже работаю, когда я заканчиваю набирать это)
Спасибо!