Как проверить подмодули в Python с помощью hasattr - PullRequest
0 голосов
/ 13 июля 2010

Во время выполнения код Python получает имя подмодуля для загрузки, чего я раньше не знал.Теперь я хочу проверить, существует ли этот подмодуль внутри существующего модуля.Рассмотрим эту структуру, где можно указать foo и bar:

master/
|
|- __init__.py
|
|- foo/
|  |
|  |- __init__.py
|
|- bar/
   |
   |- __init__.py

Теперь обычно я делаю это, что работает для def и переменных:

import master

unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
    pass # all's well

или IЯ ловлю AttributeError, которая работает одинаково.

Однако, с вышеупомянутой файловой структурой, я не могу использовать этот подход и работать.hasattr() всегда возвращает False (то есть всегда генерируется ошибка AttributeError).

Если я посмотрю на dir(master), я увижу этот вывод:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

и даже явно указав__all__ в master/__init__.py не помогает, но изменяет dir () на

['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

Любая идея, что я делаю не так, или если есть способ выполнить такие тесты?(Кстати: Python 2.6 на Win / Cygwin, если это интересно)

Ответы [ 3 ]

2 голосов
/ 13 июля 2010

Подмодули не являются атрибутами своих родительских модулей, если они не указаны явно.Просто попробуйте импортировать модуль и поймать ImportError:

try:
    __import__("os.peth", fromlist=[os])
except ImportError:
    pass
1 голос
/ 29 мая 2014

Мне недавно пришлось проверить существование субмодуля, и, поскольку я использую python 3.4.1, я даю новый ответ на вопрос:

В Python 3.4.1 вы можете использовать importlib.util.find_spec(name, package=None) (https://docs.python.org/3.4/library/importlib.html#importlib.util.find_spec)

import importlib
module_exists = importlib.util.find_spec('path.to.my.module')

Это просто =)

1 голос
/ 13 июля 2010

вы можете сделать

try:
 import module.submodule

except ImportError:
  print 'failed or whatever'
...