我正在使用Python 3.4,正在尝试argparse
与子解析器一起使用,并且我希望具有与Python
2.x中类似的行为,如果我不提供位置参数(以指示子解析器/子程序)我会收到一条有用的错误消息。即,随着python2
我将得到以下错误消息:
$ python2 subparser_test.py
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments
我正在required
按照http://codingdict.com/questions/172394建议设置属性,但是这给了我Python
3.4.0错误: TypeError: sequence item 0: expected str instance, NoneType found
-完全追溯:
$ python3 subparser_test.py
Traceback (most recent call last):
File "subparser_test.py", line 17, in <module>
args = parser.parse_args()
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1717, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1749, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1984, in _parse_known_args
', '.join(required_actions))
TypeError: sequence item 0: expected str instance, NoneType found
这是我的程序subparser_test.py
-改编自https://docs.python.org/3.2/library/argparse.html#sub-
commands:
import argparse
# sub-command functions
def foo(args):
print('"foo()" called')
# create the top-level parser
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
subparsers.required = True
# create the parser for the "foo" command
parser_foo = subparsers.add_parser('foo')
parser_foo.set_defaults(func=foo)
args = parser.parse_args()
args.func(args)
您需要给subparsers
一个dest
。
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='cmd')
subparsers.required = True
现在:
1909:~/mypy$ argdev/python3 stack23349349.py
usage: stack23349349.py [-h] {foo} ...
stack23349349.py: error: the following arguments are required: cmd
为了发出此“缺少参数”错误消息,代码需要给该参数命名。对于位置自变量(如子表达式),该名称(默认情况下)为“目标”。在您链接的SO答案中有一个(次要)说明。
argparse
在上一个Python版本中,为数不多的“补丁”之一改变了它测试“必需”参数的方式。不幸的是,它引入了有关次解析器的错误。此问题需要在下一个版本中解决(如果不能尽快)。
如果您希望在Py2中具有此可选的子解析器行为,则最好的选择是使用两阶段解析器
相关的错误/问题中有一些近期活动
https://bugs.python.org/issue9253
正在对此进行修复:https :
//github.com/python/cpython/pull/3027
问题内容: 我有一个CSV文件,其中存在一些引用问题: SuperCSV使这些蠕虫(双关语)感到窒息。我知道应该应该是,但事实并非如此。LibreOffice实际上正确解析了这一点(这让我感到惊讶)。我当时只是想编写自己的小解析器,但是其他行在字符串中都带有逗号: 有人知道Java库会处理这种疯狂的东西吗?还是我应该尝试所有可用的?还是我最好自己解决这个问题? 问题答案: 正确的解决方案是找到生成
我得到了 fxml_example.fxml FXMLExAmple.java
问题内容: 我想在脚本中定义不同的子解析器,两个子解析器均从同一个父级继承选项,但具有不同的默认值。但是,它没有按预期工作。 这是我所做的: 当我从命令行运行脚本时,得到的是: 显然,第二个覆盖了父对象中的第一个。由于argparse文档中没有任何内容(非常详细),所以我认为这可能是一个错误。 有一些简单的解决方案吗?之后,我可以检查变量,并使用每个子解析器的预期默认值替换值,但这就是我期望arg
和(表单验证)有什么区别?
我刚刚开始创建我的第一个OpenAPI定义(2.0版),我一直被这个错误所困扰: 无效的OpenAPI文件。请修复模式错误:\n\"/参数/分类Param\":域:验证;关键字:oneOf;消息:实例与一个模式不完全匹配;匹配:0" 它只是一个类似于“/cat/count”的查询,它将返回一个整数,即有多少猫-“cat”是所需的路径参数。我的参数定义到底有什么问题?
有人能举一个例子,说明在VTD XML解析器中使用联合运算符(|)吗?以下内容不适用于VTD XML解析器,但适用于jxpath解析器/a |/b