Как я могу перечислить, что импортируется при вызове "from foo import *"
. Я пробовал sys.modules.keys(), но это дает более низкоуровневые типы данных.Что загружается при использовании «from foo import»
ответ
Вы должны импортировать foo
без *
, так что вы можете использовать dir
получить все имена в foo
:
import foo
print dir(foo)
Это выводит только: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'], но я знаю, что есть панель модулей, если она не указана здесь? – user1767754
Субмодули не являются частью родительского модуля. – Daniel
Хорошо, как я могу узнать, какие подмодули загружены или является частью модуля partent? – user1767754
Как правило Python, работает from foo import *
считается плохим стилем (непитоновский), как это загрязняет пространство имен.
Я задал ваш вопрос и подумал, и вот что я придумал. Копировать/вставить следующий текст в IPython, используя удобную функцию %paste
волшебную IPython, либо сохранить его в скрипт и запустить его напрямую:
import pkgutil
def list_all_modules(top_level_package):
modnames = []
package = top_level_package
prefix = package.__name__ + "."
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix):
modnames.append(modname)
if ispkg:
module = __import__(modname, fromlist="dummy")
recurse_modnames = list_all_modules(module)
modnames += recurse_modnames
return modnames
Теперь вы можете импортировать ваш модуль/библиотека foo
, передать его на эту функцию, и получить назад список (из str
объектов) всех доступных модулей/подмодулей под пакетом foo
. Как так:
modnames = list_all_modules(foo)
print modnames
В качестве теста я буду запускать его на html5lib
библиотеку доступных here.
In [2]: from pprint import pprint
In [3]: import html5lib
In [4]: modnames = list_all_modules(html5lib)
In [5]: pprint(modnames)
['html5lib.constants',
'html5lib.filters',
'html5lib.filters._base',
'html5lib.filters.alphabeticalattributes',
'html5lib.filters.inject_meta_charset',
'html5lib.filters.lint',
'html5lib.filters.optionaltags',
'html5lib.filters.sanitizer',
'html5lib.filters.whitespace',
'html5lib.html5parser',
'html5lib.ihatexml',
'html5lib.inputstream',
'html5lib.sanitizer',
'html5lib.serializer',
'html5lib.serializer.htmlserializer',
'html5lib.tokenizer',
'html5lib.treeadapters',
'html5lib.treeadapters.sax',
'html5lib.treebuilders',
'html5lib.treebuilders._base',
'html5lib.treebuilders.dom',
'html5lib.treebuilders.etree',
'html5lib.treebuilders.etree_lxml',
'html5lib.treewalkers',
'html5lib.treewalkers._base',
'html5lib.treewalkers.dom',
'html5lib.treewalkers.etree',
'html5lib.treewalkers.genshistream',
'html5lib.treewalkers.lxmletree',
'html5lib.treewalkers.pulldom',
'html5lib.trie',
'html5lib.trie._base',
'html5lib.trie.datrie',
'html5lib.trie.py',
'html5lib.utils']
Это, безусловно, чувствует, как непитоновский способ сделать это, но если у кого есть лучший способ, пожалуйста, дайте мне знать. :)
Вы ищете список объектов и методы и функции, которые вы можете вызвать в foo? – Ben
Допустим, у меня есть несколько модулей в одном каталоге, и я делаю * из импорта mymodules *, я хотел бы знать, что на самом деле было загружено – user1767754
И теперь вы знаете, почему мы этого не делаем. –