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

Checking if variable exists in Namespace

我正在尝试使用我的 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;但我一辈子都想不出如何有效地做到这一点。

如果通过列表理解解决了我的问题(在使用提示使用 vars() 之后):

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

l 是字典中值为 'True'

的键列表

Use vars() to convert your namespace to a dictionary,然后使用 dict.get('your key') 它将 return 你的对象(如果它存在),或者 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

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

比我想象的 vars(ns).get("battery") 干净得多。