使用命令行输入参数从要在主程序中使用的一组子类中选择一个子类

2024-04-27 02:44:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一种在主程序中调用泛型子类的方法,其中可以从中选择的特定子类可以具有唯一的输入参数。你知道吗

我有一个主程序,主.py,将给定测试的结果与基本模型的结果进行比较。不同的测试是存储在模块中的子类测试.py. 我正在尝试找出调用中任何给定测试(子类)的最佳方法主.py通过提供命令行输入参数。(每个子类可以有不同数量的参数,有些参数由配置文件提供。)

我目前的方法是可行的,但感觉很笨拙,应该有更好的方法:

  1. 在主程序中,主.py,我使用字典选择所需的子类:

    test_case = tests.select_subclass(case)(下面的函数示例)

在哪里

tests.py是包含各种子类的模块,函数select_subclass; case在命令行中作为输入参数提供

  1. 我使用eval初始化给定的测试用例:

    test = eval(test_case)

  2. 然后使用给定子类中的run函数根据需要运行函数:

    test.run(x, y)

其中xy是每个子类的run函数中需要的两个变量。你知道吗

tests.py

def select_subclass(key): 

    subclss_dict = {
            ‘Test1’: ‘tests.Test1(in1, in2)’
            ‘Test2’: ‘tests.Test2(config.getint(“test2”, “intvar1”),' 
                     'config.getint(“test2”, “intvar2”), in1, in2)’
            ‘Test3’: ‘tests.Test3(config.get(“test3”, “var1”),' 
                     'config.getint(“test3”, “intvar”),'          
                     'config.get(“test3”, “var2”), in1, in2)’
                      }

从ini配置文件中读取某些子类的输入变量。你知道吗

我使用的是python2.7

我仍然习惯于有效地使用类,任何关于如何更干净/更好地使用类的建议都将不胜感激。你知道吗


Tags: 方法函数runpytestconfig参数tests
1条回答
网友
1楼 · 发布于 2024-04-27 02:44:03

在与一位同事讨论之后,他提出了一种更干净、更简单的方法:

  1. 使子类模块化:测试.py只能容纳基类。每个子类都将是自己的模块(并且导入测试以便继承基类)。

  2. 将测试模块动态导入到主.py地址:

    try:
        test_mod = __import__(case) 
    except ImportError:
        # exit program if import fails
        raise SystemExit
    
  3. 实例化实例:

    ctest = getattr(test_mod, case)
    # in1, in2 will be used in every subclass and are global variables
    a_test = test(in1, in2)
    a_test.get_input(config)
    

其中get_input()是每个子类中的一个函数,它为给定的测试用例获取必要的输入参数:

(例如,对于Test2子类)

    def get_input(self, config):
        self.intvar1 = config.getint("test2", "intvar1")
        self.intvar2 = config.getint("test2", "intvar2")

config = ConfigParser.RawConfigParser()

相关问题 更多 >