我试图找到一种方法在命令行中添加方法名作为参数。我在python 2.7.10中使用argparse模块。
def create_parser():
parser = argparse.ArgumentParser(description='add method name')
parser.add_argument('--method_name', help='pass method name to be used')
return parser
def foo():
return "I am here."
def bar():
return "I am not here."
def where_are_you(method_name):
return method_name()
def main():
return where_are_you(args.method_name)
if __name__ == '__main__':
main()
我试图通过命令行调用其中一个方法并收到此错误: " TypeError:' str'对象不可调用。" 请指导我这里我是python的新手。
答案 0 :(得分:1)
我添加了一个从名称到功能对象的字典。此字典还可用于限制解析器接受的选择。
import argparse
def create_parser():
parser = argparse.ArgumentParser(description='add method name')
parser.add_argument('--method_name', help='pass method name to be used',
choices=adict)
return parser
def foo():
return "I am here."
def bar():
return "I am not here."
adict = {'foo': foo, 'bar': bar} # map names to functions
def where_are_you(method_name):
fn = adict[method_name]
# could also use getattr
return fn()
def main():
args = create_parser().parse_args() # get the string
print(args.method_name) # debugging
return where_are_you(args.method_name)
if __name__ == '__main__':
print(main()) # show the return
测试:
0001:~/mypy$ python stack45667979.py -h
usage: stack45667979.py [-h] [--method_name {foo,bar}]
add method name
optional arguments:
-h, --help show this help message and exit
--method_name {foo,bar}
pass method name to be used
0001:~/mypy$ python stack45667979.py --method_name foo
foo
I am here.
0002:~/mypy$ python stack45667979.py --method_name baz
usage: stack45667979.py [-h] [--method_name {foo,bar}]
stack45667979.py: error: argument --method_name: invalid choice: 'baz' (choose from 'foo', 'bar')
之前的重复
Calling a function of a module from a string with the function's name
使用getattr
执行模块命名空间的常规搜索,以使字符串与函数匹配。这可以在这里使用,但对初学者来说可能太高级了,即使对于高级程序员来说也许太开放了。通常最好将用户的选择限制为已知有效的一组。
如果这个字典映射令人困惑,我建议一个更明显的映射
if args.method == 'foo':
foo()
elif args.method == 'bar':
bar()
else:
parser.error('bad method choice')