Ato*_*lan 1 function argparse python-3.x
需要帮助理解 Python 3 中的 argparse 用例。尝试编写一个使用参数调用各种函数的简单程序。例如:
[程序] [操作] [可选参数]
nachos.py delete 20394739
- or -
nachos.py -d 20394739
nachos.py search 30459389
- or -
nachos.py -s 30459389
nachos.py list
- or -
nachos.py -l
Run Code Online (Sandbox Code Playgroud)
试图弄清楚如何使用 Python 3 实现这一点。请帮忙。谢谢你!
import argparse
parser = argparse.ArgumentParser(description='Example list of options')
parser.add_argument('-d', '--delete', action='delete', help='Delete ID')
parser.add_argument('-s', '--search', action='search', help='Search ID')
parser.add_argument('-l', '--list', action='list', help='List all ID')
args = parser.parse_args()
def (some function to handle each case)
Run Code Online (Sandbox Code Playgroud)
* 更新 *
到目前为止,这似乎有效,但检查可能很长的 if 语句列表似乎又慢又笨拙。有没有办法用一个看起来更具体、更重要的函数来做到这一点?
parser = argparse.ArgumentParser(description='Example list of options', add_help=True)
parser.add_argument('-d', '--delete', dest='command', action='store_const', const='delete', help='Delete ID')
parser.add_argument('-s', '--search', dest='command', action='store_const', const='search', help='Search ID')
parser.add_argument('-l', '--list', dest='command', action='store_const', const='list', help='List all ID')
args = parser.parse_args()
if args.command == 'delete':
print('Run delete')
elif args.command == 'search':
print('Run search')
else:
print('Run list')
Run Code Online (Sandbox Code Playgroud)
action您需要查看文档中参数的含义argparse。
parser.add_argument('-d', '--delete', action='delete', help='Delete ID')
parser.add_argument('-s', '--search', action='search', help='Search ID')
parser.add_argument('-l', '--list', action='list', help='List all ID')
Run Code Online (Sandbox Code Playgroud)
这些不是有效值。有效的字符串包括“store”(默认)、“append”、“store_true”等。他们指的是定义的argparse操作,而不是您的功能。
如果我将你的解析器更改为:
parser = argparse.ArgumentParser(description='Example list of options')
parser.add_argument('-d', '--delete', help='Delete ID')
parser.add_argument('-s', '--search', help='Search ID')
parser.add_argument('-l', '--list', action='store_true',help='List all ID')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
这些输入将产生一个显示如下的 args:
nachos.py --delete 20394739
nachos.py -d 20394739
args.delete # '20394739'
nachos.py --search 30459389
nachos.py -s 30459389
args.search # '30459389'
nachos.py --list
nachos.py -l
args.list # True
Run Code Online (Sandbox Code Playgroud)
您需要在解析后检查这些值以决定采取什么操作。 argparse弄清楚你的用户想要什么。您有责任采取行动。
在学习和调试时,这是一个好主意
print(args)
In [194]: print(parser.parse_args('--delete 2039 --search 304 -l'.split()))
Namespace(delete='2039', list=True, search='304')
In [195]: print(parser.parse_args('-d 2039'.split()))
Namespace(delete='2039', list=False, search=None)
Run Code Online (Sandbox Code Playgroud)
查看解析如何与输入匹配。
有更复杂的方法可以做到这一点,例如subparsers和set_defaults,但我认为您需要argparse首先了解基本工作原理。
子解析器部分下的 argparse 文档讨论了分派到命令(子命令 setdefaults)。这是使用 的一个变体store_const。
In [2]: parser=argparse.ArgumentParser();
In [3]: parser.add_argument('-d')
In [4]: def foo(args):
...: print(args)
In [5]: parser.add_argument('-f',action='store_const',const=foo)
Run Code Online (Sandbox Code Playgroud)
您store_const可以将函数(而不仅仅是其字符串名称)放入 args 属性中。我可以在其参数中放置不同的函数default。
In [6]: args=parser.parse_args('-d 1234 -f'.split())
In [7]: print(args)
Namespace(d='1234', f=<function foo at 0xac24ca4c>)
Run Code Online (Sandbox Code Playgroud)
请注意,args.f现在是一个函数,而不是一个字符串。
In [8]: if args.f is not None:
...: args.f(args)
...:
Namespace(d='1234', f=<function foo at 0xac24ca4c>)
Run Code Online (Sandbox Code Playgroud)