На первый взгляд, функции C-API PyModule_New
и PyModule_NewObject
, очевидно, создают новый объект модуля.
В официальной документации по Python приводится следующее объяснение PyModule_NewObject
:
Возвращает новый объект модуля с атрибутом name, для которого установлено значение name. Заполняются только атрибуты модуля doc и name; вызывающая сторона отвечает за предоставление атрибута file.
PyModule_New
делает то же самое, за исключением того, что принимает строку C (char*
) в качестве аргумента для имени модуля вместо строки PyObject*
.
Хорошо, это довольно просто, но...
Мой вопрос: какая польза от вызова функции API PyModule_NewObject
?
Конечно, теоретически это было бы здорово для ситуации, когда вы хотите динамически создать новый модуль. Но проблема в том, что на практике после создания нового объекта модуля единственным способом сделать что-то полезное для него будет добавление объектов (таких как методы, классы, переменные и т. д.) в атрибут __dict__
модуля. Таким образом, пользователи модуля могли импортировать его и что-то с ним делать.
Проблема в том, что атрибут __dict__
модуля только для чтения:
>>> import re
>>> x = re
>>> re.__dict__ = { "foo" : "bar" }
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: readonly attribute
Так что на практике, насколько я понимаю, с динамически созданным модулем действительно невозможно сделать что-то полезное. Итак, какова цель функции C API PyModule_New
?