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

Posted

技术标签:

【中文标题】需要将`-`字符嵌入到python argparse中的参数中【英文标题】:Need to embed `-` character into arguments in python argparse 【发布时间】:2016-04-30 11:02:06 【问题描述】:

我正在设计一个工具来满足一些规范。我有一个场景,我希望参数包含 - 它的字符串。注意下面一行中的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 将args.args-1 解释为args.args - 1,减法。 【参考方案1】:

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

if args.arg_1:  
    print "verbosity turned on"

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

任何内部- 字符都将转换为_ 字符以使 确保字符串是有效的属性名称。

【讨论】:

@sudhishkr --arg-1 是一个布尔值 (store_true),表示在命令行中传递时为 TRUE,不在命令行参数中时为 FALSE。这就是它的工作原理。布尔参数不能有值 我对那个不好。发表评论后,我真的意识到了这一点。我删除了我的,看起来你立即回复了。我正在采用您的方法,但将选择 Dan.D 的答案作为此 Q 的正确答案,因为它适用于任何特殊字符。谢谢@felipsmartins【参考方案2】:
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 方法。存在讨论是否应更改此行为的错误/问题。但就目前而言,如果你想让自己变得艰难,那是你的事。

在内部,argparse 使用getattrsetattr 访问namespace,以尽量减少对属性名称的限制。

【讨论】:

以上是关于需要将`-`字符嵌入到python argparse中的参数中的主要内容,如果未能解决你的问题,请参考以下文章

python argpare 模块的简单用法

python的argpare和click模块详解

在 C++ 中嵌入 Python。传递接收列表列表的字符串向量

python使用textwrap包在已经生成的长字符串中嵌入回车符实战

是否可以将带有许多包的 Python 脚本嵌入到 C# 中?

如何将动态数据嵌入到 JSON 字符串中