2016-05-17 2 views
-1

Как я могу перечислить, что импортируется при вызове "from foo import *". Я пробовал sys.modules.keys(), но это дает более низкоуровневые типы данных.Что загружается при использовании «from foo import»

+0

Вы ищете список объектов и методы и функции, которые вы можете вызвать в foo? – Ben

+0

Допустим, у меня есть несколько модулей в одном каталоге, и я делаю * из импорта mymodules *, я хотел бы знать, что на самом деле было загружено – user1767754

+3

И теперь вы знаете, почему мы этого не делаем. –

ответ

4

Вы должны импортировать foo без *, так что вы можете использовать dir получить все имена в foo:

import foo 
print dir(foo) 
+0

Это выводит только: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'], но я знаю, что есть панель модулей, если она не указана здесь? – user1767754

+0

Субмодули не являются частью родительского модуля. – Daniel

+0

Хорошо, как я могу узнать, какие подмодули загружены или является частью модуля partent? – user1767754

2

Как правило 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'] 

Это, безусловно, чувствует, как непитоновский способ сделать это, но если у кого есть лучший способ, пожалуйста, дайте мне знать. :)