【问题标题】:How do I refactor a script that uses argparse to be callable inside another Python script?如何重构使用 argparse 的脚本以在另一个 Python 脚本中调用?
【发布时间】:2017-05-24 18:02:33
【问题描述】:

我有一个用于查找测试名称的脚本,并在我们公司中广泛使用。它像这样在命令行上运行:

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 完成,因为它没有在公司范围内安装,这可能是一个艰巨的过程。

【问题讨论】:

    标签: python refactoring argparse


    【解决方案1】:

    您不应该只是将所有代码直接移动到一个函数中;这根本没有帮助。

    您应该做的是将需要运行的代码移到函数中。 (而且由于它是外部接口,它不应该以_ 开头。)只需要从命令行运行的代码——即解析器的东西——应该留在__name__ == '__main__'块,它应该将其结果传递给main()

    所以:

    def main(TYPE, test_name, test_id=None, normalise=False):
        # ... body of script...
    
    if __name__ == "__main__":
        parser = ...
        ...
        args = parser.parse_args()
        main(**vars(args))
    

    (而且 docopt 并不是什么新鲜事物;它是一些人喜欢的外部库。)

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多