Python автоматический (или динамический) классы импорта в пакетах - PullRequest
2 голосов
/ 11 июня 2009

Я пишу какой-то автоматизированный набор тестов и хочу убедиться, что классы, содержащиеся в «тестах» пакета, автоматически импортируются во время выполнения в основном пространстве имен, без добавления их в файл __init__ пакета .

Итак, вот сценарий, который у меня есть:

import os

for dirpath, dirnames, filenames in os.walk('tests'):
    for filename in filenames:
        if filename.lower().endswith(('.pyc', '__init__.py')): continue

        module = ".".join([dirpath, filename.split('.')[0]])

        print module

Если я использую modulename = __import__(module), классы добавляются в модуль 'modulename', а не в основное пространство имен.

Мой вопрос: как мне импортировать их в текущее пространство имен?

Так что я могу делать такие вещи, как:

testcase = TestCase()
testcase.run()
results = testcase.results()

или что-то в основном сценарии без явного импорта классов.

Заранее спасибо!

Спасибо всем, что ответили и пытаетесь помочь мне.

Ответы [ 6 ]

3 голосов
/ 11 июня 2009

Чтобы получить классы из какого-то модуля, может быть лучший способ, но вот общий способ, с чего можно начать

mod = __import__("mod")
for klass in vars(mod):
    o =  getattr(mod, klass)
    if type(o) == type:
        print o
1 голос
/ 11 июня 2009

Я не уверен, что точно понимаю ваш вопрос, но вы можете попробовать нос до обнаружить ваши тестовые наборы.

0 голосов
/ 03 сентября 2015

Вместо использования __import__ и присвоения его такой переменной, как эта

modulename = __import__(module)

Вместо этого используйте importlib.import_module и не назначайте его:

import importlib
importlib.import_module(module)

По крайней мере, на Python 3.4, это отлично работает.

0 голосов
/ 14 марта 2013

Поместите этот код в __init__.py пакета тестов, и он импортирует все тесты в текущем пакете и подпакетах.

import pkgutil
import unittest

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(module_name).load_module(module_name)
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
            exec ('%s = obj' % obj.__name__)

Как уже говорили другие, если вы пытаетесь обнаружить все свои тесты, есть лучшие способы.

0 голосов
/ 12 июня 2009

вы можете использовать exec для форматированной строки для каждого имени модуля в вашей отсканированной директории:

exec "from %s import *" % moduleName
0 голосов
/ 11 июня 2009

Я не до конца понимаю необходимость, потому что вы можете собрать все модули и пройти через классы тестовых примеров

но если вы хотите получить все имена в текущей области видимости используйте что-то вроде

execfile("mod.py")

все классы, определенные в mod.py, попадут в область действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...