首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3 call解析调用函数

Python3 call解析调用函数
EN

Stack Overflow用户
提问于 2017-03-15 19:21:16
回答 3查看 6.7K关注 0票数 1

需要帮助理解Python3中的a解析用例。尝试编写一个使用参数调用各种函数的简单程序。例如:

程序可选参数

代码语言:javascript
复制
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实现这一点,请帮助。谢谢!

代码语言:javascript
复制
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)

* UPDATE *

到目前为止,这似乎是可行的,但是根据一个可能很长的if语句列表进行检查似乎又慢又笨重。难道没有办法用一个似乎更具体、也更关键的函数来实现这一点吗?

代码语言:javascript
复制
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')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-15 19:27:43

您需要检查action文档中argparse参数的含义。

代码语言:javascript
复制
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')

这些都不是有效值。有效的字符串是诸如“存储”(默认)、“附加”、“存储_真”之类的内容。它们指的是定义的argparse操作,而不是您的函数。

如果我将解析器更改为:

代码语言:javascript
复制
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()

这些输入将产生一个args,显示如下:

代码语言:javascript
复制
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可以计算出用户想要什么。你有责任对此采取行动。

学习和调试是个好主意

代码语言:javascript
复制
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)

查看解析如何与输入匹配。

对于subparsersset_defaults这样的东西,有更详细的方法可以实现,但是我认为您需要首先了解基本的argparse工作原理。

子解析器部分下的argparse讨论了如何分配给命令(子命令集默认值)。这里有一个使用store_const的变体。

代码语言:javascript
复制
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参数中添加一个不同的函数。

代码语言:javascript
复制
In [6]: args=parser.parse_args('-d 1234 -f'.split())
In [7]: print(args)
Namespace(d='1234', f=<function foo at 0xac24ca4c>)

注意,args.f现在是一个函数,而不是一个字符串。

代码语言:javascript
复制
In [8]: if args.f is not None:
   ...:     args.f(args)
   ...:     
Namespace(d='1234', f=<function foo at 0xac24ca4c>)
票数 5
EN

Stack Overflow用户

发布于 2017-03-15 19:31:54

action参数到add_argument()不接受任意字符串值。相反,它为您提供了预定义操作的选择。在你的例子中,你可能想做这样的事情

代码语言:javascript
复制
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来检查用户选择的操作。

代码语言:javascript
复制
if args.command == 'delete':
     ...
elif args.command == 'search':
     ...

如果有许多功能,也可以:

代码语言:javascript
复制
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__()方法:

代码语言:javascript
复制
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__()

票数 1
EN

Stack Overflow用户

发布于 2017-03-15 19:29:36

调用程序中指定的参数时,

代码语言:javascript
复制
...
parser.add_argument('-d', '--delete', action='delete', help='DeleteID')
...

使用该选项调用程序的选项语法是

代码语言:javascript
复制
nachos.py -d 20394739
# OR
nachos.py --delete 20394739
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42818876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档