我有一个可以找到测试名称的脚本,并且在我们公司中广泛使用。它在命令行上运行,如下所示:
find_test.py --type <type> --name <testname>
脚本内部相当于:
import argparse
parser = argparse.ArgumentParser(description='Get Test Path')
parser.add_argument('--type', dest='TYPE', type=str, default=None, help="TYPE [REQUIRED]")
parser.add_argument('--name', dest='test_name', type=str, default=None, help="Test Name (Slow)")
parser.add_argument('--id', dest='test_id', type=str, default=None, help="Test ID (Fast)")
parser.add_argument('--normalise', dest='normalise', action="store_true", default=False, help="Replace '/' with '.' in Test Name")
args = parser.parse_args()
(不确定所有这些论点的作用,我个人只使用前两个)。然后,这些行由使用这些参数的代码继续。
我想重构这个脚本,以便我可以将其作为模块导入,但也保留其命令行功能 - 因为很多人使用这个脚本,并且在我们的一些csh脚本中也会调用它。
到目前为止我已经重构了它,就像这样:
def _main():
<all the former code that was in find_test.py>
if __name__ == "__main__":
_main()
这仍然可以从命令行运行。但我不知道如何在我的父脚本中将相关开关的参数传递给它。
如何进一步重构,然后在父脚本中调用它? 这可能吗?
我也不愿意使用我读过的docopts是新的argparse,除非必要 - 也就是说不能用argparse来完成,因为它没有在公司范围内安装,这可能是一个艰巨的过程。
答案 0 :(得分:3)
您不应该只将所有代码直接移动到函数中;这根本没有用。
你应该做的是将需要运行的代码移动到函数中。 (因为它是外部接口,所以它不应该以{{1}}开头。)只需要从命令行运行的代码 - 即解析器的东西 - 应该保留在中{ {1}}阻止,它应将结果传递给_
。
所以:
__name__ == '__main__'
(而docopt不是新的东西;它是一个人们喜欢的外部库。)