我注意到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,因为它可能是版本问题,我想提一下。
答案 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
具有完全相同的效果;在命名空间中设置相同的目标名称。