在命名空间中检查变量是否存在

10

我正在尝试使用argparse的输出(简单argparse仅包含4个位置参数,每个参数根据设置为True的变量而触发函数)

Namespace(battery=False, cache=True, health=False, hotspare=False)

目前,我正在尝试找出最佳方法向Python询问何时其中一个变量设置为True;而不必像我现在这样硬编码:

if args.battery is True:
    do_something()
elif args.cache is True:
    do_something_else()
etc ...

我更希望只使用一个命令来检查变量是否存在于命名空间中,并且它是否设置为True;但是我却无法想出如何以高效的方式实现这一点。


3
argparse 使用 getattr(namespace, dest) 来检查数值。vars(args) 创建一个字典,你可以从中获取键和值。 - hpaulj
4个回答

7

您可以使用 hasattr(ns, "battery") (假设 ns = Namespace(battery=False, cache=True, health=False, hotspare=False))。

我认为这比 vars(ns).get("battery") 更简洁。


3

如果使用列表推导式解决了我的问题(在使用vars()提示之后):

l = [ k for (k,v) in args.items() if v ]

l是字典中值为'True'的键的列表。


3

回答标题(而不是OP详细问题),要检查变量a是否定义在ns命名空间中:

'a' in vars(ns)

3

使用vars()将你的命名空间转换为字典,然后使用dict.get('你的键'),如果存在该对象,则返回该对象,否则返回None

示例

my_args.py

import argparse


_parser = argparse.ArgumentParser("A description of your program")

_parser.add_argument("--some-arg", help="foo", action="store_true")
_parser.add_argument("--another-one", type=str)

your_args_dict = vars(_parser.parse_args())

print(your_args_dict.get('some_arg'))
print(your_args_dict.get('another_one'))
print(your_args_dict.get('foo_bar'))

命令行

$ python3 my_args.py --some-arg --another-one test

True
test
None


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接