我是argparse新手,所以这可能是基础。在
我希望所有的字符串常量都定义一次(blah = 'foo'
),然后在整个代码中使用它。当我到达set_defaults
时,似乎我仅限于kwarg类型的参数。在
也就是说,parser.set_defaults(NUM=ONE)
不将NUM视为字符串。这里有一个更完整的例子:
ONE = 'one'
TWO = 'two'
SIX = 'six'
NUMBER_OPTS = [ONE, TWO, SIX]
NUM = 'num'
parser = argparse.ArgumentParser()
pform = parser.add_mutually_exclusive_group()
for opt in NUMBER_OPTS:
pform.add_argument('--'+opt, dest=NUM, action='store_const', const=opt)
parser.set_defaults(NUM=ONE) # Can't find a syntax to make this DWIM
args = parser.parse_args()
print("%s is %s" % (NUM, vars(args)[NUM]))
所以当add_argument
接受一个字符串作为目的地时,set_defaults
则不是
您可以使用字典扩展:
只需稍作修改即可运行代码:
alist
包含指向由add_argument
语句创建的3Action
对象的指针。我本来可以从pform._group_actions
得到相同的列表,因为这些动作被添加到了那个组中。在通过显式设置}(从long标志派生):
^{pr2}$dest
,它是'num'
,而不是{parser.set_defaults(num=ONE)
将带有dest='one'
的操作的default
属性设置为“one”。在此默认值也可以在循环中定义为:
对于列表中的第一个,
default
也足够了,剩下的是默认的None
。这是解析开始时如何设置默认值的结果。在我可以用以下方法验证:
const
按预期工作:解析的命名空间中的
num
值可以通过多种方式获取:(
_
是前面的答案。它也存储在Out
列表中。)另一个技巧是在解析之前定义一个命名空间对象。在那里定义的任何值优先于默认值。请注意,
Namespace(...)
定义与set_defaults
具有相同的语法:与大多数语言一样,Python对符号和字符串进行了区分。只引用字符串。符号可用于命名变量、对象属性和函数关键字。在
在您的例子中,
NUM
是一个符号,'num'
是一个字符串。{{{cd21>中的值是{cd21}的值。在alist[0].dest
中,dest
是属性名,其值是字符串'num'
。在但是
argparse
接受这个a.dest
值,并使用它在args
命名空间中定义一个属性。这就是为什么num
可以用作下面的属性名:argparse
实际上使用getattr
和{这对
dest
值施加了一些假设;它们甚至不必是有效的属性名。在我在一篇评论中指出,字典也可以用符号和字符串来定义:
关键字参数,包括开放的
**kwargs
,也跨越了符号/字符串边界:因此,虽然Python区分了符号和字符串,但它有各种跨越边界的方式。在
NUM=ONE
运行,但定义了一个args.NUM
属性。在现在让我们去掉
NUM
默认值用于
诚然,这并没有太大变化;只是消除了
**
扩展。在Python中没有办法使(…NUM=ONE…)表示(…'num':一个。在也许这整本字典的生意都是在偷懒。我们可以传递dest和default的元组
换句话说,我们只需要一种将
dest
值与default
值配对的方法。它不一定是一个字典key:value
映射。在您可以使用^{} 的
default
参数来执行此操作:相关问题 更多 >
编程相关推荐