需要将 `-` 字符嵌入到 python argparse 中的参数中

Need to embed `-` character into arguments in python argparse

我正在设计一个工具来满足一些规范。我有一个场景,我希望参数包含 - 它的字符串。注意下面一行中的arg-1

python test.py --arg-1 arg1Data  

我正在 python27 上使用 argparse 库。出于某种原因,argparse 与上述试验混淆了。

我的问题是如何避免这种情况?如何在我的论点中保留 -

示例程序(包含 -,如果删除它一切正常):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--arg-1", help="increase output verbosity")
args = parser.parse_args()
if args.args-1:
   print "verbosity turned on"

Python argparse 模块用下划线替换破折号,因此:

if args.arg_1:  
    print "verbosity turned on"

Python 文档(第 15.4.3.11. dest 节的第二段)指出:

Any internal - characters will be converted to _ characters to make sure the string is a valid attribute name.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--arg-1", help="increase output verbosity")
parser.add_argument("arg-2")
args = parser.parse_args()
print(args)

产生:

1750:~/mypy$ python stack34970533.py -h
usage: stack34970533.py [-h] [--arg-1 ARG_1] arg-2

positional arguments:
  arg-2

optional arguments:
  -h, --help     show this help message and exit
  --arg-1 ARG_1  increase output verbosity

1751:~/mypy$ python stack34970533.py --arg-1 xxx yyy
Namespace(arg-2='yyy', arg_1='xxx')

第一个参数是 optional。您可以在命令行中使用“--arg-1”,但该值存储为 args.arg_1。 Python 会将 args.arg-1 解释为 args.arg - 1。 unix 命令行允许带有 - 标志的历史由来已久。它试图平衡这两种传统。

它让您完全控制 positionals dest 属性,并且不会将 - 更改为 _。如果你想访问它,你必须使用 getattr 方法。 bug/issue 正在讨论是否应更改此行为。但现在,如果你想让自己难受,那是你的事。

在内部,argparse 使用 getattrsetattr 访问 namespace 以最小化对属性名称的限制。