Вызов метода из импортированного файла python

#python #oop #class

#python #ооп #класс

Вопрос:

У меня есть такая структура каталогов. В корневом каталоге моего проекта у меня есть основной файл python, который говорит main.py . Также в корневом каталоге this есть папка с именем Tests . В этой тестовой папке будет серия тестовых файлов (известных только во время выполнения), например test1.py ,test2.py и т.д… В моих тестовых файлах, например Test1.py У меня есть такая структура:

 from  TestBase import TestBase          
class Test1(TestBase):              
    def TestFunction(self):    
        # do_some_stuff
 

В моем main.py Я хочу вызвать эту функцию testFunction(). Как мне это сделать?

      # use sys.path.append() to add Tests directory our path           
     x= import(testfilename)        
     result = x.TestFunction() # something like this method from class in testfilename    
 

Комментарии:

1. Неясно, что означает ваш код. В чем актуальность class Test1 ? Есть TestFunction() ли метод в этом классе? self В конце концов, у него есть параметр, но нет отступа. Но опять же, вы вызываете x.TestFunction() второй фрагмент кода, как если TestFunction() бы это была функция уровня модуля. Любые разъяснения были бы хороши.

2. @Sven Я улучшил форматирование и добавил информацию, в каждом тестовом файле есть класс, названный в честь имени файла. Например test1.py имеет класс с именем Test1, test2.py имеет Test2 и т.д.. testFunction — это метод класса Test1

Ответ №1:

Начиная с Python 2.7, необходимая функциональность включена во встроенный unittest модуль. Для более ранних версий Python этот модуль был перенесен обратно под именем unittest2 .

Если по какой-то причине вы хотите выполнить собственное тестовое обнаружение, вот базовый подход:

 import glob
import sys
import TestBase
sys.path.append("tests")
for path in glob.iglob("tests/*.py"):
    module = __import__(os.path.basename(path)[:-3])
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, type) and issubclass(obj, TestBase.TestBase):
            test = obj()
            test.TestFunction()
 

Комментарии:

1. Можете ли вы объяснить, что это делает: если isinstance(obj, type) и issubclass(obj, TestBase . TestBase): test = obj()

2. Это проверяет, является ли obj это подклассом TestBase , и если это так, создает экземпляр этого класса.

3. Просто чтобы подтвердить, правильно ли я понимаю, isinstance(obj,type) проверяет, имеет ли obj тип ‘class’ . В нашем примере будет проверяться, относится ли Test1 к типу class и является ли производным от TestBase

4. @johnnyalpaca: Ваше понимание верно. Первая часть проверки ( isinstance(obj, type) ) предназначена только для того, чтобы вторая часть ( issubclass(obj, TestBase.TestBase) ) не выдавала исключение, что и произошло бы, если obj бы вообще не было типом.

Ответ №2:

я не уверен, как вы хотите добавлять тестовые файлы во время выполнения.. я бы попробовал это,

try:
import Test.test1 as t1
test= True;
except ImportError:
test = False ;

Вы можете использовать системный вызов, чтобы найти тестовый файл, доступный во время выполнения. Затем попробуйте импортировать их с помощью цикла for, как показано выше.

Ответ №3:

я думаю, вам нужно сделать что-то подобное, если testfilename находится в /test/ dir

 m = __import__('test.testfilename')
t = m.Test1()
x = t.TestFunction()
 

дайте мне знать, если это сработает