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

Python 2.7 Argparse使用该文件中另一个文件的函数,python-2.7,function,argparse,subparsers,Python 2.7,Function,Argparse,Subparsers,我有两门课: OptionParser 我试图在官方文档、Google等中找到答案,但没有找到任何结果。我假设您使用的是set\u defaults(func=method\u name)和子parser,如argparse文档中所示?这是调用函数的一种简单方法。它利用了在args名称空间中定义默认值和设置属性的灵活性。但是没有专门用于此功能的代码 将函数与这样的操作相关联通常是处理每个子parser的不同操作的最简单方法。但是,如果需要检查调用的子Parser的名称,则add_subparse

我有两门课:

OptionParser
我试图在官方文档、Google等中找到答案,但没有找到任何结果。

我假设您使用的是
set\u defaults(func=method\u name)
和子parser,如
argparse
文档中所示?这是调用函数的一种简单方法。它利用了在
args
名称空间中定义默认值和设置属性的灵活性。但是没有专门用于此功能的代码

将函数与这样的操作相关联通常是处理每个子parser的不同操作的最简单方法。但是,如果需要检查调用的子Parser的名称,则add_subparser()调用的dest关键字参数将起作用:

第二句话是允许你使用

if self.options.action == 'tags'
在您的情况下,设置默认值并不是最简单的方法

argparse
主要是一种了解用户需要什么的方法。它不是用来当调度员的。通常这是代码的责任

其他
argparse
问题给我的印象是,大多数时候程序员都不使用这个
set\u defaults
选项。搜索SO中的
[argparse]set_default
只会找到37篇帖子(答案或问题)(相比之下,仅argparse标签就有1.5K个问题)


下面是一个工作脚本,它实现了我将
set\u默认值
传递给
解析器
设置函数的想法。它是一个文件,但是
解析器
部分也可以导入

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

基本目标是将命令行字符串与函数调用配对
set\u defaults
是在
argparse
中执行的一种方法。但是类似字典的
dd
也广泛用于Python代码中。
if/else
语句也是如此。

这有什么不对吗?这似乎不是正确的解决方案。我希望能够使用:
self.options.func()
您能提供更多的上下文吗?这似乎是参数解析和类之间非常紧密的耦合,这将使两者都更难测试。我一直在考虑的另一个解决方法是将代码拆分为三个文件/类:OptionParser、Application和Wrapper。包装器将导入OptionParser和应用程序,OptionParser将导入应用程序(这样应用程序的方法可以提供给
设置默认值(func=)
,而应用程序将不导入OptionParser(相反,类的实例将作为参数传递).这有意义吗?不太有意义。再说一次,提供更多的上下文;这个问题是为了对您正在使用的功能进行不那么抽象的演示。好的,谢谢。我想我必须满足于“解决方法”解决方案,然后.BTW,原因是我希望避免使用条件语句块,而直接求助于调用正确的函数。您可以通过函数调用参数将函数从主函数传递到导入模块。我在我的答案中添加了粗略的草图。细节将不得不等待。HM,我会考虑。谢谢。当然,代码审阅者不会对此表示不满,但这肯定是值得检查的。
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[args.cmdstr](None)