Python 2.7 Argparse使用该文件中另一个文件的函数
我有两门课: OptionParserPython 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
我试图在官方文档、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)