使用命令行输入参数

时间:2015-12-09 20:40:38

标签: python class

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

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

我目前的方法有效,但感觉很笨,并且应该有更好的方法:

  1. 在主程序main.py中,我使用字典来选择我想要的子类:

    test_case = tests.select_subclass(case)(以下功能示例)

  2. 其中

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

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

      test = eval(test_case)

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

      test.run(x, y)

    3. 其中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配置文件中读取某些子类的输入变量。

      我正在使用python 2.7

      我仍然习惯于有效地使用课程,并且对于如何以更清洁/更好的方式执行此操作的任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

在与同事讨论之后,他提出了一种更清洁,更容易的方法:

  1. 使子类模块化:tests.py只保存基类。每个子类都是它自己的模块(并导入测试,因此基类将被继承)。

  2. 将测试模块动态导入main.py:

    BiMap
  3. 实例化实例:

    try:
        test_mod = __import__(case) 
    except ImportError:
        # exit program if import fails
        raise SystemExit
    
  4. 其中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) 是每个子类中的一个函数,用于获取给定测试用例的必要输入参数:

    (例如,对于Test2子类)

    get_input()

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

相关问题