我会尽力描述我遇到的问题。我正在构建一个基于多个类构建的Python程序并使用unittest框架。简而言之,Main.py文件有一个“ValidateDriver”类,它将“driver”变量定义为ElementTree类型。如果我直接将其指向我需要解析的XML文件(即driver = ElementTree.parse(rC:\ test.xml)),那么我可以从另一个类访问它。但是,实际上我没有从命令行传入的实际XML文件,直到你到达ValidateDriver类中的Main函数。所以在ValidateDriver类下,驱动程序实际上是driver = ElementTree,然后在main函数中我将该变量重新分配给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
答案 0 :(得分:0)
主要问题似乎是你的主脚本被包装在一个类中。这真的没有理由,而且非常令人困惑。
if __name__ == "__main__":
main_object = ValidateDriver()
main_object.main(sys.argv[1:])
这应该超出班级定义
答案 1 :(得分: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:])
但我强调这是非标准的,不应该是必要的。