Недавно я столкнулся с проблемой в расширении python на основе C, пытаясь создать объекты без вызова его конструктора - это требование расширения.PyInstance_NewRaw() со старыми и новыми классами стилей
Класс будет использоваться для создания экземпляров получается динамически: в какой-то момент, у меня есть экземпляр x
класс которого я хотел бы использовать для создания других экземпляров, поэтому я храню x.__class__
для последующего использования - пусть это значение будет klass
,
В более позднем пункте я вызываю PyInstance_NewRaw(klass, PyDict_New())
, а затем возникает проблема. Кажется, что если klass
является классом старого стиля, результатом этого вызова является желаемый новый экземпляр. Однако, если это класс нового типа, результат NULL и исключения, сгенерированные является:
SystemError: ../Objects/classobject.c:521: bad argument to internal function
Для записи, я использую Python версии 2.7.5
. Погуляв, я заметил не более одного другого человека, который искал решение (и мне показалось, что он делает обходное решение, но не детализировал его).
Для записи # 2: экземпляры расширения является создание прокси для этих же x
случаев - в x.__class__
и x.__dict__
«s известны, поэтому расширение порождая новые экземпляры на основе __class__
(с использованием вышеупомянутой функции C) и установка соответствующего __dict__
в новый экземпляр (данные __dict__
имеют данные совместной обработки между процессами). Не только концептуально проблематично вызвать второй экземпляр __init__
(первый: это состояние уже известно, во-вторых: ожидаемое поведение для ctors заключается в том, что они должны быть вызваны ровно один раз для каждого экземпляра), это также нецелесообразно, поскольку расширение не могут определить аргументы и их порядок для вызова __init__()
для каждого экземпляра в системе. Кроме того, изменение __init__
каждого класса в системе, экземпляры которого могут быть прокси-серверами и информировать их о существовании механизма прокси-сервера, к которому они будут подвергнуты, концептуально проблематичны (они не должны знать об этом) и непрактичны.
Итак, мой вопрос: как выполнить то же поведение PyInstance_NewRaw
, независимо от стиля класса экземпляра?
[Я должен спросить ...] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), почему это требование расширения?Должна быть какая-то основная причина, по которой вам это нужно ... и, вероятно, лучший способ удовлетворить эту основную причину, чем это требование. – abarnert
@abarnert, не вдаваясь в подробности, я отредактировал сообщение, чтобы объяснить, почему это требование. –
Я думаю, что _is_ намного проще. Я отредактирую свой ответ, чтобы объяснить. – abarnert