冲突情况下argparse中变量的推断名称是什么

时间:2017-11-20 10:17:40

标签: python python-3.x argparse

我注意到argparse使用了一个相当" mystic"在解析器中创建变量的方法。我知道变量的名称通常很容易infer: 它是长或短选项的剥离版本(分别没有---)。

所有连字符(-)都变为下划线(_)成为合法变量名称。

但这让我有一个关于冲突案件的问题(我知道这是一个极端的案例,但推断的部分对我来说有点神秘)。例如程序:

import argparse
parser = argparse.ArgumentParser(description="A simple test about var names")
parser.add_argument("--max-value", type=int, help="the maximum value", metavar="Maximum-value")
parser.add_argument("-m", "--max_value", action="store_true", help="Whether to the use maximum value", dest="max1")
args = parser.parse_args()
print("max_value {}".format(args.max1))
print("max-value {}".format(args.max_value))

显然使用两个非常相似的选项(--max-value--max_value),这些选项会导致相同的推断变量max_value。如果缺少其中任何一个选项,变量将max_value没有歧义。

但是当两者都存在时,显然--max_value获得奖杯变量max_value而第二个(--max-value)获得了什么?我还没能找到第二个变量。

那么,要访问它,我必须使用dest选项显式定义变量?如何获取可用变量名称列表?有趣的是,如果我使用dest=作为--max_value选项,则--max-value会获得预期变量max_value,而--max_value会获得非推断变量max1案例dest)!

我也知道metavar与实际变量名称无关,只影响帮助中的显示。

编辑:

从@Martijn Pieters回答中添加一些信息:

如果我在写入时没有应用dest,则解析器遵循一般规则,该规则声明应用了隐式dest="max_value"。在我的案例parser.add_argument("--max-value", type=int, help="the maximum value") 中也一样。

所以,

parser.add_argument("--max-value", type=int, help="the maximum value", dest="max_value")

与:

完全相同
# parserv1.py
import argparse
parser = argparse.ArgumentParser(description="A simple test about var names")
parser.add_argument("-m", "--max_value", action="store_true", help="Whether to the use maximum value", dest="max_value")
parser.add_argument("--max-value", type=int, help="the maximum value", metavar="Maximum-value", dest="max_value")
args = parser.parse_args()
print("max-value {}".format(args.max_value))

>>>python parserv1.py -m --max-value 3

内部。

但是,以下代码片段应该产生不同的结果,而不是:

# parserv2.py
import argparse
parser = argparse.ArgumentParser(description="A simple test about var names")
parser.add_argument("--max-value", type=int, help="the maximum value", metavar="Maximum-value", dest="max_value")
parser.add_argument("-m", "--max_value", action="store_true", help="Whether to the use maximum value", dest="max_value")
args = parser.parse_args()
print("max-value {}".format(args.max_value))

>>>python parserv1.py -m --max-value 3
  

max-value 3

max_value
  

max-value 3

两者都只是将int的值打印为int,而与宣布它们的顺序无关。

那么, $(document).ready(function() { var mc; $('#login').on('focusout', function() { var mc = $('#login').val(); alert(mc) }); $("#submit").on('mouseover', function() { alert(mc) }); }); 选项的优先级高于二进制(即标志)?在这些情况下,期权类型是否重要?

P.S。 我使用的是python 3.6.3,因为它可能是版本问题,我想提一下。

1 个答案:

答案 0 :(得分:5)

这里没有冲突;对于org.junit.Test--max-value,库只会生成完全相同的目标名称。写入相同--max_value目的地名称的多个选项完全有效;在这种情况下,命令行上使用的最后一个选项获胜:

dest

此处>>> parser = argparse.ArgumentParser() >>> parser.add_argument("--option1", dest="foo") _StoreAction(option_strings=['--option1'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None) >>> parser.add_argument("--option2", dest="foo") _StoreAction(option_strings=['--option2'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None) >>> parser.parse_args(['--option2', 'bar', '--option1', 'baz']) Namespace(foo='baz') 获胜,因为--option1 baz最后一次在命令行中使用。

请注意,在命令行解析之前应用任何默认值; 第一个注册选项默认值获胜。然后解析命令行,如果仅使用一个选项,那么与该选项关联的操作自然会获胜。

您可以选择不冲突的目的地名称。不选择容易混淆的选项字符串也是一个好主意。

如果您正在寻找关于为给定可选参数生成--option1名称的正式规则集,请参阅dest option documenation

  

对于可选参数操作,dest的值通常从选项字符串中推断出来。 dest通过获取第一个长选项字符串并删除最初的ArgumentParser字符串来生成dest的值。如果未提供长选项字符串,则将通过剥离初始--字符从第一个短选项字符串派生dest。任何内部-字符都将转换为-个字符,以确保该字符串是有效的属性名称。

所有写入相同_目标名称的多个选项对于支持给定选项的旧的,已弃用的名称非常有用:

dest

因此,在命令行中使用parser.add_argument('-n', '--new', dest='new', help="New hotness option") # old name for the new hotness option, now deprecated but still supported # argparse.SUPPRESS ensures it is no longer listed in the help output parser.add_argument('-o', '--old', dest='new', help=argparse.SUPPRESS) -o与使用--old-n具有完全相同的效果;在命名空间中设置相同的目标名称。