在 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)
应该与任何接受 setattr
、getattr
和 hasattr
方法的对象一起工作。字典不行。
如果给定字典,我得到的第一个错误是
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)
我正在 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)
应该与任何接受 setattr
、getattr
和 hasattr
方法的对象一起工作。字典不行。
如果给定字典,我得到的第一个错误是
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)