0

我会尽力描述我遇到的问题。我正在构建一个基于多个类并使用 unittest 框架的 Python 程序。简而言之,Main.py 文件有一个“ValidateDriver”类,它将“驱动程序”变量定义为 ElementTree 类型。如果我将它直接指向我需要解析的 XML 文件(即 driver = ElementTree.parse(rC:\test.xml)),那么我可以从另一个类访问它。但是,实际上,在您访问 ValidateDriver 类中的 Main 函数之前,我没有从命令行传入的实际 XML 文件。因此,在 ValidateDriver 类下,驱动程序实际上是 driver = ElementTree,然后在主函数中,我将该变量重新分配给 ValidateDriver.driver = ElementTree.parse(args.driver)。然而,这就是症结所在。当我去其他类并尝试调用 ValidateDriver.driver 时,我没有可用的“findall”方法/属性。同样,它唯一可行的方法是执行以下操作:ElementTree.parse(rC:\test.xml))。如果我在 C# 中执行此操作,它会起作用,但我是 Python 新手,这让我很生气。任何帮助/建议表示赞赏。我已经包含了这两个类的代码。

主功能:

import sys
import argparse
import xml.etree.ElementTree as ElementTree
import unittest
import Tests.TestManufacturer


class ValidateDriver:
    driver = ElementTree

    def main(argv):
        parser = argparse.ArgumentParser(description='Validation.')
        parser.add_argument('-d', '--driver', help='Path and file name xml file', required=True)
        parser.add_argument('-v', '--verbosity',
                            help='Verbosity for test output.  1 for terse, 2 for verbose.  Default is verbose',
                            default=2, type=int)
        #args = parser.parse_args()
        args = r'C:\test.c4i'
        #print ("Validate Driver: %s" % args.driver)
        #print ("Verbosity Level: %s" % args.verbosity)

        ValidateDriver.driver = ElementTree.parse(r'C:\test.c4i')

        loader = unittest.TestLoader()
        suite = loader.loadTestsFromModule(Tests.TestManufacturer)


        runner = unittest.TextTestRunner(verbosity=2) # TODO Remove this...
        # TODO Uncomment this...  
        runner = unittest.TextTestRunner(verbosity=args.verbosity)
        result = runner.run(suite)


    if __name__ == "__main__":
        main(sys.argv[1:])

其他类,测试厂商:

import unittest
import Main


manufacturer = ['']


class Tests(unittest.TestCase):

    # Test to see if Manufacturer exists.
    def test_manufacturer_exists(self):
        for m in Main.ValidateDriver.driver.findall('./manufacturer'):
            print m.text

产生以下错误:

C:\Python27\python.exe C:\Users\test\PycharmProjects\Validator\Main.py
Traceback (most recent call last):
  File "C:\Users\test\PycharmProjects\Validator\Main.py", line 22, in <module>
    class ValidateDriver:
  File "C:\Users\test\PycharmProjects\Validator\Main.py", line 65, in ValidateDriver
    main(sys.argv[1:])
  File "C:\Users\test\PycharmProjects\Validator\Main.py", line 36, in main
    ValidateDriver.driver = ElementTree.parse(r'C:\test.c4i')
NameError: global name 'ValidateDriver' is not defined

Process finished with exit code 1
4

2 回答 2

0

这与可用的“findall”无关。问题是在您尝试访问它时,该类本身尚未完全声明。在 python 中,文件是从上到下读取的。例如,这是不允许的:

if __name__ == "__main__":
    f()

def f():
    ...

声明后,调用f必须在文件底部发生。

你正在做的事情ValidateDriver是相似的,因为直到直接在其主体中的语句被执行之前类才被定义(这与函数不同,它们的主体当然在被调用之前不会被执行)。您main(sys.argv[1:])在类体内调用,而后者又尝试访问ValidateDriver.driver尚不存在的 。

最好,该main函数以及调用它的代码应该在类之外。据我所知,该类根本不需要存在(这不是 C# 或 Java——您可以将代码直接放在模块级别,而无需类容器)。如果你坚持把它作为一个静态方法放在一个类中,它必须被定义为一个类方法:

@classmethod
def main(cls, argv):
    ...

然后可以调用(在类定义之外),例如:

ValidateDriver.main(sys.argv[1:])

但我强调这是非标准的,不应该是必要的。

于 2013-08-01T23:48:06.920 回答
0

主要问题似乎是您的主脚本被包装在一个类中。这真的没有任何理由,而且非常令人困惑。

if __name__ == "__main__":
    main_object = ValidateDriver()
    main_object.main(sys.argv[1:])

这应该超出类定义

于 2013-08-01T23:33:11.493 回答