首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >and解析和自定义操作-代码路径不明显

and解析和自定义操作-代码路径不明显
EN

Stack Overflow用户
提问于 2018-12-06 20:52:41
回答 2查看 350关注 0票数 0

我使用own解析来摘要文本命令,而不是试图提交我自己的自定义解析器,但是代码路径并不明显。请考虑以下几点:

代码语言:javascript
复制
import argparse

##class ReadAction(argparse.Action):
##    def __init__(self, option_strings, dest, nargs=None, **kwargs):
##        if nargs is not None:
##            raise ValueError("nargs not allowed")
##        super(ReadAction, self).__init__(option_strings, dest, **kwargs)
##    def __call__(self, parser, namespace, values, option_strings=None):
##        print("Read a file")
##        setattr(namespace, self.dest, values)

class ExitAction(argparse.Action):
    def __init__(self, option_strings, dest, nargs=None, **kwargs):
        if nargs is not None:
            raise ValueError("nargs not allowed")
        super(ExitAction, self).__init__(option_strings, dest, **kwargs)
    def __call__(self, parser, namespace, values, option_strings=None):
        print("Exiting the program")
        setattr(namespace, self.dest, values)

def setup_parser(parser):
##    parser.add_argument('read', help='Reads in a file', action=ReadAction)
    parser.add_argument('exit', help='Exit command', action=ExitAction)

def run():
    parser = argparse.ArgumentParser()
    setup_parser(parser)
    while True:
        raw_input = input("Command >>>").split(' ')
        args = parser.parse_args(raw_input)
        print(args)
    print('Good bye')

if __name__ == '__main__':
    run()

如果按原样运行它,就会得到预期的输出:

代码语言:javascript
复制
Command >>>exit
Exiting the program
Namespace(exit='exit')

但是,如果我删除评论并再次运行,我就会得到一个意想不到的行为:

代码语言:javascript
复制
Command >>>exit
Read a file
usage: prog.py [-h] read exit
prog.py: error: the following arguments are required: exit

有谁了解这段代码的路径吗?这就好像__call__方法没有被调用(讽刺)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-06 21:21:39

两个参数readexit都需要一个字符串。

解析第一个字符串将导致调用ReadAction.__call__,并在args名称空间中设置一个值。如果只提供一个字符串,则解析器会引发错误,因为没有提供exit参数。如果您提供了两个字符串,那么第二个字符串将被赋予ExitAction.__call__

如果解析器在没有错误的情况下结束,那么您的代码将继续使用while循环,而不会有任何退出。该循环的唯一出路是由解析器引发错误。

使用此错误,解析器将打印使用情况和消息,然后调用sys.exit(2)-h命令将导致调用-h操作。它打印帮助并调用sys.exit(2)

虽然argparse可以用于解析input字符串,但它不是为该任务设计的。通常它会解析sys.argv[1:]。也就是说,ipython magic命令通常使用argparse来解析参数,就像shell命令一样。

argparse不根据值分配位置参数--它严格按照位置分配位置参数。如果同时定义了readexit,那么第一个字符串将传递给read,而不管它的值如何,第二个字符串将传递给exit。(见我最近的回答:https://stackoverflow.com/a/53605878/901925)

标记(optionals)是根据值分配的。但是要使用这些命令,你必须发出如下命令

--阅读foo --出口酒吧

票数 0
EN

Stack Overflow用户

发布于 2018-12-06 20:57:45

您不是将命令绑定到文字字符串readexitargparse不是这样工作的。相反,您正在定义一个解析器,它接受两个任意的单词,并将第一个单词绑定到read,第二个绑定到exit。无论您输入哪个单词,您的注释代码都会退出,而不仅仅是exit。如果没有注释,解析器将需要两个单词,并在只提供一个单词时引发一个错误。

如果您打算(Ab)以这种方式使用argparse,我建议您阅读文档中的子命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53659503

复制
相关文章

相似问题

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