在 Python3 中的 argparse 包中将当前命名空间与 pars_args() 一起使用

Use the current namespace with pars_args() in the argparse package in Python3

我正在 Python3 中使用 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)

有办法处理吗? 或者我必须像这样自己手动制作:

args = parser.parse_args()
profile_name = args.profile_name

您可能会混淆 'namespace'.

的两种用法

一个namespace是保存这个模块或函数的变量的字典。

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

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)) 将这些参数放入函数的命名空间。这样可以更好地本地化更改。它还允许您使用普通关键字语法定义变量。

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

args = parser.parse_args()

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