Python 3 argparse调用函数
Python 3 argparse call function
需要帮助理解 Python 中的 argparse 用例 3. 尝试编写一个使用参数调用各种函数的简单程序。例如:
[程序][动作][可选参数]
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
正在尝试弄清楚如何使用 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)
* 更新 *
到目前为止这似乎有效,但检查可能很长的 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')
您需要查看 argparse
文档中 action
参数的含义。
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')
这些不是有效值。有效字符串是 '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()
这些输入将产生一个显示如下的参数:
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
您需要在解析后检查这些值以决定采取什么操作。 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)
查看解析与输入的匹配情况。
有更详细的方法可以做到这一点,例如 subparsers
和 set_defaults
,但我认为您需要先了解基本的 argparse
工作原理。
subparsers 部分下的 argparse 文档讨论了调度命令 (subcommand 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)
使用 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>)
请注意 args.f
现在是一个函数,而不是字符串。
In [8]: if args.f is not None:
...: args.f(args)
...:
Namespace(d='1234', f=<function foo at 0xac24ca4c>)
调用程序中指定的参数时,
...
parser.add_argument('-d', '--delete', action='delete', help='DeleteID')
...
使用该选项调用程序的选项语法是
nachos.py -d 20394739
# OR
nachos.py --delete 20394739
add_argument()
的 action
参数不采用任意字符串值。相反,它为您提供了预定义操作的选择。在你的情况下,你可能想做类似
的事情
parser = argparse.ArgumentParser(description='Example list of options')
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()
然后您可以访问 args.command
以检查用户选择的操作。
if args.command == 'delete':
...
elif args.command == 'search':
...
如果函数比较多,还可以:
def handle_delete(args):
pass
# ... as above
args = parser.parse_args()
eval('handle_' + args.command)(args)
eval
在当前模块中查找名称handle_<command>
,然后调用返回的对象。因此对于 delete
命令,我们调用 handle_delete(args)
。请注意,您必须注意 command
不是任意 Python 代码。
另一种方法是覆盖提供 argparse.Action
的子类并覆盖每个操作的 __call__()
方法:
class DeleteAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
for value in values:
print('Deleting {}'.format(value))
parser = argparse.ArgumentParser()
parser.add_argument('-d', nargs=1, action=DeleteAction)
此处 values
将包含 -d
的参数。但是请注意,__call__()
将在解析期间被调用。
需要帮助理解 Python 中的 argparse 用例 3. 尝试编写一个使用参数调用各种函数的简单程序。例如:
[程序][动作][可选参数]
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
正在尝试弄清楚如何使用 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)
* 更新 *
到目前为止这似乎有效,但检查可能很长的 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')
您需要查看 argparse
文档中 action
参数的含义。
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')
这些不是有效值。有效字符串是 '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()
这些输入将产生一个显示如下的参数:
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
您需要在解析后检查这些值以决定采取什么操作。 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)
查看解析与输入的匹配情况。
有更详细的方法可以做到这一点,例如 subparsers
和 set_defaults
,但我认为您需要先了解基本的 argparse
工作原理。
subparsers 部分下的 argparse 文档讨论了调度命令 (subcommand 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)
使用 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>)
请注意 args.f
现在是一个函数,而不是字符串。
In [8]: if args.f is not None:
...: args.f(args)
...:
Namespace(d='1234', f=<function foo at 0xac24ca4c>)
调用程序中指定的参数时,
...
parser.add_argument('-d', '--delete', action='delete', help='DeleteID')
...
使用该选项调用程序的选项语法是
nachos.py -d 20394739
# OR
nachos.py --delete 20394739
add_argument()
的 action
参数不采用任意字符串值。相反,它为您提供了预定义操作的选择。在你的情况下,你可能想做类似
parser = argparse.ArgumentParser(description='Example list of options')
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()
然后您可以访问 args.command
以检查用户选择的操作。
if args.command == 'delete':
...
elif args.command == 'search':
...
如果函数比较多,还可以:
def handle_delete(args):
pass
# ... as above
args = parser.parse_args()
eval('handle_' + args.command)(args)
eval
在当前模块中查找名称handle_<command>
,然后调用返回的对象。因此对于 delete
命令,我们调用 handle_delete(args)
。请注意,您必须注意 command
不是任意 Python 代码。
另一种方法是覆盖提供 argparse.Action
的子类并覆盖每个操作的 __call__()
方法:
class DeleteAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
for value in values:
print('Deleting {}'.format(value))
parser = argparse.ArgumentParser()
parser.add_argument('-d', nargs=1, action=DeleteAction)
此处 values
将包含 -d
的参数。但是请注意,__call__()
将在解析期间被调用。