在Python3的argparse包中使用当前命名空间和pars_args()

时间:2015-09-18 16:05:41

标签: python-3.x argparse

我在Python3中使用this.Then(/^I should see at least one element in each container$/, function () { page.element.all(by.css('.container')) .each(function (ele, index) { ele.$$('.row') // get all the row elements in each div .then(function(elements) { expect(elements.length).to.be.greaterThan(0); }); }); }); 模块。解析后的参数的结果将作为argparse对象返回。但我希望将它们放在当前的命名空间中而不是另一个。

Namespace

有办法解决这个问题吗? 或者我必须自己手动制作:

#!/usr/bin/env python3
import argparse

parser = argparse.ArgumentParser(description='desc')
parser.add_argument('--profile', dest='profile_name', help='help')

# I need the magic here    
print( parser.parse_args(namespace=self) )
print(profile_name)

2 个答案:

答案 0 :(得分:1)

您可能会混淆“命名空间”的两种用法。

一个namespace是包含此模块或函数变量的字典。

parser.parse_args()创建一个argparse.Namespace对象,并使用setattr将其值放入其中。这个类定义非常简单。

parser.parse_args(namespace=myNamespace)应与任何接受setattrgetattrhasattr方法的对象一起使用。字典不起作用。

如果给出字典,我得到的第一个错误是

setattr(namespace, action.dest, default)
AttributeError: 'dict' object has no attribute 'checked'

您是否这样问,因为您想将argparse属性直接放在本地命名空间字典中?

您可以使用vars(args)将命名空间转换为字典。您可以使用update(例如locals().update(vars(args)))将这些项目添加到另一个词典中。

或者如果你有一个带**kwargs的函数,你可以使用:foo(**vars(args))将这些参数放入函数的命名空间。这样可以更好地本地化变更。它还允许您使用普通关键字语法定义变量。

答案 1 :(得分:0)

我不推荐这个,因为它可以覆盖以前定义的变量,特别是如果你想要的只是输入几个字符,但你可以添加变量到全局范围如下:

args = parser.parse_args()

for k, v in args.__dict__.items():
    globals()[k] = v
print(profile_name)