‘супер’ является встроенным. Если вы не пытались удалить встроенные функции, вы не должны видеть, что «глобальное имя« super »не определено».
Я смотрю на вашу пользовательскую веб-ссылку , где есть дамп IntrospectionHelper. Очень трудно читать без отступа, но, похоже, вы делаете именно это:
built_in_list = ['__builtins__', '__doc__', '__file__', '__name__']
for i in built_in_list:
if i in module.__dict__:
del module.__dict__[i]
Это оригинальный модуль, который вы меняете, а не информационная копия, которую вы собираетесь вернуть! Удалите этих участников из действующего модуля, и вы можете ожидать гораздо большего, чем просто «супер».
Очень трудно отслеживать, что делает этот модуль, но моя реакция заключается в том, что в нем слишком много магии. Среднестатистической программе на Python никогда не нужно возиться с членами модуля import system, sys.path и monkey-patching __magic__. Немного магии может быть изящной уловкой, но это чрезвычайно хрупко. Не смотря на то, что он просматривается, код может быть взломан такими вещами, как:
- конфликт имен с модулями верхнего уровня
- любое использование классов в новом стиле
- модули поставляются только в виде скомпилированного байт-кода
- zipimporter
Из невероятно округлых функций, таких как getClassDefinitions, extractModuleNames и isFromBase, мне кажется, у вас еще есть немало, чтобы узнать об основах работы Python. (Подсказки: getattr, module .__ name__ и issubclass, соответственно.)
В этом случае сейчас не время погружаться в магию импорта! Это трудно . Вместо этого делайте вещи Нормальным Путем Питона. Это может быть немного больше, чтобы напечатать в нижней части пакета mypackage / __ init__.py:
from mypackage import fooplugin, barplugin, bazplugin
plugins= [fooplugin.FooPlugin, barplugin.BarPlugin, bazplugin.BazPlugin]
но это будет работать и быть понятым везде, не полагаясь на гнездо сложной, хрупкой магии.
Кстати, если вы не планируете какую-то углубленную работу по множественному наследованию (и опять же, сейчас, возможно, не время для этого), вам, вероятно, даже не нужно использовать super (). Обычный метод «IPlugin .__ init __ (self, ...)» для вызова известного суперкласса является простым делом; super () не всегда «более новый, лучший способ сделать что-то», и есть вещи, которые вы должны понять об этом , прежде чем приступить к его использованию.