Вопрос реализации для шаблона проектирования метода шаблона / фреймворка в python - PullRequest
0 голосов
/ 23 февраля 2020

Я реализую шаблон разработки метода шаблона в python, и у меня есть вопрос о том, должна ли вспомогательная функция в шаблонном методе абстрактного класса быть экземпляром или функцией stati c. Оба будут работать, но я не уверен в достоинствах и недостатках обоих подходов.

Справочная информация

Я пишу фреймворк для поддержки тестирования изображений, где я могу подключить различные методы тестирования. в зависимости от типа изображения et c, поэтому я использую шаблон проектирования метода шаблона.

Абстрактный шаблонный метод класса для тестирования должен будет поддерживать параллельное тестирование изображений и поддерживать выполнение это либо с использованием многопроцессорной обработки (если выполняется локально), либо с помощью AWS лямбда-выражения, если выполняется на AWS.

. Я хочу инкапсулировать детали 'run_tests_locally' и 'run_tests_lambda' в вспомогательные функции, чтобы избежать беспорядка метод основного шаблона.

Вопрос

Мой вопрос заключается в том, лучше ли сделать приведенные выше функции run_tests в качестве A) методов экземпляра или B) stati c методов в моем абстрактном классе определение. ... см. Ниже

Казалось бы, оба работают, но не уверены, какой из них лучше, и хотели бы получить некоторые советы / мысли

from abc import ABC, abstractmethod

import util.misc as misc

class TestFramework(ABC):
    """
    Abstract class for executing tests
    """

    @abstractmethod
    def filter(self, objs):
        """Take list of objects, and return filtered list of those to test"""
        pass

    @abstractmethod
    def do_test(self, obj):
        """Take a single object, test it, and return dict of results"""
        pass


    def execute_test(self, file_list):
        """Execute test"""

        # library function
        all_objs = misc.load_files(file_list)

        # instance template function - shortlist objects
        to_test_objs = self.filter(all_objs)

        # now test objects

        # how is it best to implment the 'run_tests' functions?
        #    A) instance methods?
        #    B) static methods?

        # if running on aws, do tests across multiple lambda
        # if local, use MP to run in parallel

        if env = 'aws':
            # as an instance method
            test_results = self.run_tests_lambda(to_test_objs)
            # as static:
            test_results = run_tests_lambda_STATIC(to_test_objs, self.do_test)

        else:       
            # instance form:
            test_results = self.run_tests_local(to_test_objs)
            # static form:     
            test_results = run_tests_local_STATIC(to_test_objs, self.do_test)


        return test_results


    # instance method implementation
    def run_tests_local(self, to_test_objs):

        all_results = {}

        with ProcessPoolExecutor as e:

            procs = [e.submit(self.do_test, obj) for obj in to_test_objs]

            for proc in as_completed(procs):
                all_results.update(proc.result())

        return all_results


    # static method implementation
    @staticmethod
    def run_tests_local_STATIC(to_test_objs, test_fn):

        all_results = {}

        with ProcessPoolExecutor as e:

            procs = [e.submit(test_fn, obj) for obj in to_test_objs]

            for proc in as_completed(procs):
                all_results.update(proc.result())

        return all_results


...