Как вызвать метод, который был обнаружен через inspect.getmembers? - PullRequest
1 голос
/ 26 января 2010
import re
import sys
import inspect
import testcases

testClass = re.compile(r'.*Case$')
testMethod = re.compile(r'.*Test$')

for class_name, class_obj in inspect.getmembers(testcases, inspect.isclass):
    if testClass.match(class_name):
        for method_name, method_obj in inspect.getmembers(class_obj, inspect.ismethod):
            if testMethod.match(method_name):
                # RIGHT HERE I WOULD LIKE TO INVOKE method_name

Ответы [ 2 ]

6 голосов
/ 26 января 2010

Сразу после вашего кода:

for class_name, class_obj in inspect.getmembers(testcases, inspect.isclass):
    if testClass.match(class_name):
        for method_name, method_obj in inspect.getmembers(class_obj, inspect.ismethod):
            if testMethod.match(method_name):
                # RIGHT HERE I WOULD LIKE TO INVOKE method_name

Вы могли бы сделать:

            methodobj = getattr(classobj, method_name)
            methodobj("appropriate arguments go here")

если , то есть вы имели какое-либо представление о том, что за "подходящие аргументы" Первым аргументом предположительно будет экземпляр класса - который экземпляр? Как вы получаете или создаете это? А как насчет всех других аргументов? Каковы они и какие ценности вы хотите передать за них?

Получение объекта метода, готового к вызову, является наименьшей из ваших проблем - getattr, как вы видите, делает это действительно хорошо и легче всего! выше относительно аргументов (особенно первого, экземпляра, для которого вы хотите вызвать метод), прежде чем ваш вопрос вообще имеет большой смысл! -)

0 голосов
/ 26 января 2010

Большое спасибо alex за быстрый ответ.

Первый аргумент предположительно будет экземпляром класса - какой экземпляр? Как вы получаете или создаете его?

Хорошо, так что, если я правильно вас понял, первый фрагмент вызова метода methodobj должен быть экземпляром classobj? Как насчет следующего.

methodobj = getattr(classobj, method_name)
methodobj(classobj())

А как насчет всех остальных аргументов? Каковы они и какие ценности вы хотите передать за них?

Нааа, других аргументов нет. Это тестовые случаи с установленными переменными в методах. Я просто хочу иметь возможность добавлять тестовые случаи без необходимости изменять другой код для их запуска.

Еще раз спасибо, я еще не пробовал, но из того, что я читал о getattr, кажется, что это то, что я ищу. С некоторой игрой вокруг я могу заставить это работать.

...