Argparse 使用该文件中另一个文件的函数

Argparse using function from another file within that file

我有两个类:

OptionParser
Application

存储在单独的文件中(option_parser.py 和 application.py)。前者定义了应该如何处理命令行输入。后者导入前者,读取用户输入,并继续请求。

如何调用 application.py 的应用程序中定义的方法而不将其导入 option_parser.py(因为这会导致无限循环,因为 application.py 从 [ 导入 OptionParser =25=]).如果我使用 set_defaults(func=method_name),则会被告知全局函数 method_name 未在该范围内定义。

我已经有了解决方法,但它似乎不对:

if self.options.action == 'tags':
    self.list_tags()
elif self.options.action == 'branches':
    self.list_branches()

我试图在官方文档中找到答案,Google,然后就这样 - 无济于事。

我假设您正在使用 set_defaults(func=method_name)argparse 文档中所示的子解析器?这是调用函数的简单方法。它利用了在 args 命名空间中定义默认值和设置属性的灵活性。但是没有专门用于此功能的代码。

Associating functions with actions like this is typically the easiest way to handle the different actions for each of your subparsers. However, if it is necessary to check the name of the subparser that was invoked, the dest keyword argument to the add_subparsers() call will work:

第二句允许您使用

if self.options.action == 'tags'

你的情况 set_defaults 不是最简单的方法。

argparse 主要是一种了解用户需求的方法。它并不意味着要成为调度员。通常这是您的代码的责任。

我对其他 argparse 问题的印象是大多数时候程序员不使用此 set_defaults 选项。在 SO 中搜索 [argparse] set_default 只会找到 37 个帖子(答案或问题)(相比之下,仅 argparse 标签就有 1500 个问题)。


这是一个工作脚本,它实现了我将 set_defaults 值传递给 parser 设置函数的想法。这是一个文件,但 parser 部分也可以导入。

import argparse

def make_parser(defaults):
    parser = argparse.ArgumentParser()
    sp = parser.add_subparsers(dest='cmdstr')
    sp.required = True
    for key in defaults:
        spp = sp.add_parser(key)
        spp.set_defaults(cmd=defaults[key])
    return parser

def foo(args):
    print('foo')

def bar(args):
    print('bar')

if __name__=='__main__':
    dd = {'cmd1': foo, 'cmd2': bar}
    parser = make_parser(dd)
    args = parser.parse_args()
    print(args)
    args.cmd(args)

调用示例:

0930:~/mypy$ python3 stack42897689.py cmd1
Namespace(cmd=<function foo at 0xb70c2dac>, cmdstr='cmd1')
foo
0931:~/mypy$ python3 stack42897689.py cmd2
Namespace(cmd=<function bar at 0xb7145614>, cmdstr='cmd2')
bar

有了这个 dd 字典,我可以很容易地完成调度:

dd[args.cmdstr](None)

基本目标是将命令行字符串与函数调用配对。 set_defaults 是在 argparse 内完成的一种方法。但是像 dd 这样的字典在 Python 代码中也被广泛使用。 if/else 语句也是如此。