cdp*_*dpp 5 python case-sensitive case-insensitive argparse subparsers
(在python 3.6.0上运行)
Usage: prog.py {caesar | vigenere} [key]
parser = argparse.ArgumentParser()
subp = parser.add_subparsers()
caesar = subp.add_parser("caesar", aliases=["c"], allow_abbrev=True)
args = parser.parse_args()
$ python prog.py caes 123
prog.py: error: invalid choice: 'caes' (choose from 'caesar', 'c')
Run Code Online (Sandbox Code Playgroud)
为什么subparser缩写即使带有 也无效allow_abbrev=True?
argparse基本上,在接受缩写subparsers名称/别名方面存在问题。
这是代码:
Usage: prog.py [caesar] [key]
import sys, argparse
def main(argv):
parser = argparse.ArgumentParser
(description="runs text through X cipher")
subp = parser.add_subparsers\
(help="sub-command help")
#<ArgumentParser object>
caesar = subp.add_parser\
("caesar", aliases=["c"], allow_abbrev=True)
caesar.add_argument\
("key", metavar = "key (any integer)",\
type = int, default = 0)
args = parser.parse_args()
print(caesar)
if __name__ == "__main__":
sys.argv = list(str(c).lower() for c in sys.argv[0:])
main(sys.argv)
Run Code Online (Sandbox Code Playgroud)
因此,从上面的代码来看,应该接受以下任何一项:
- "Caesar" or "caesar"
- "C" or "c"
- Any abbreviation in between "c" and "caesar"
Run Code Online (Sandbox Code Playgroud)
所以问题是这样的:
这有效:$ python prog.py c 123O
这给出了一个错误:$ python prog.py caes 123X
prog.py: error: invalid choice: 'cae' (choose from 'caesar', 'c')
Run Code Online (Sandbox Code Playgroud)
现在这是令人困惑的部分。
根据argparse 文档:
ArgumentParser 支持使用 add_subparsers() 方法创建此类子命令。add_subparsers() 方法通常不带参数调用,并返回一个特殊的操作对象。该对象有一个方法add_parser(),它接受命令名称和任何 ArgumentParser 构造函数参数,并返回一个可以照常修改的ArgumentParser 对象。
好的,那么任何人都object created with add_subparser()可以创建自己的,ArgumentParser object对object.add_parser()吧?
...这意味着这个新创建的ArgumentParser对象应该能够接受任何ArgumentParser参数,是吗?
参数解析器定义:
class
argparse.ArgumentParser(
prog=None, usage=None,
description=None, epilog=None,
parents=[],formatter_class=argparse.HelpFormatter,
prefix_chars='-',fromfile_prefix_chars=None,
argument_default=None,conflict_handler='error',
add_help=True, allow_abbrev=True)
Run Code Online (Sandbox Code Playgroud)
创建一个新的ArgumentParser对象。所有参数都应作为关键字参数传递。每个参数在下面都有其更详细的描述,但简而言之,它们是:
allow_abbrev- 如果缩写明确,则允许缩写长选项。(默认值:True)
3.5 版更改:添加了allow_abbrev 参数。
(这是在 python 3.6.0 上)
预先感谢各位
实现了允许子解析器名称缩写的补丁,但当它被证明有错误时被撤回:
允许用户关闭长选项的缩写是一个不同的问题,在
代码的两个不同部分。
allow_abbrev -如果缩写明确,则允许缩写长选项。
一个长选项是用以下命令创建的:
caesar.add_argument('-f','--foobar')
Run Code Online (Sandbox Code Playgroud)
使用默认allow_abbrev值,这将与“-f”、“--foo”和“--foobar”一起使用。在本例long_option中是“--foobar”。有了它False,'--foo' 将不起作用。
mainparser决定是否c有效caesar的cae子解析器命令(通过subp,由 所创建的特殊操作对象parser.add_subparsers)。这更像是一个位置与choices.
parser.add_argument('foo', choices = ['c', 'caesar'])
Run Code Online (Sandbox Code Playgroud)