我希望能够以字符串形式获取变量的名称,但我不知道 Python 是否具有那么多的自省功能。类似于:
>>> print(my_var.__name__) 'my_var'
我想这样做是因为我有一堆变量想转换成字典,例如:
bar = True foo = False >>> my_dict = dict(bar=bar, foo=foo) >>> print my_dict {'foo': False, 'bar': True}
但我想要一些比这更自动化的东西。
Python 有locals()和vars(),所以我想有一种方法。
locals()
vars()
虽然 Python 没有直接提供获取变量名称的功能,但你可以使用一些技巧结合 locals() 或 globals() 来实现你想要的功能。
globals()
一种方法是定义一个函数来自动检测当前作用域中的变量,然后将这些变量转换成字典:
def get_variable_names_as_dict(*variable_names): caller_locals = locals() return {name: caller_locals[name] for name in variable_names} # 定义你的变量 bar = True foo = False # 调用函数获取字典 my_dict = get_variable_names_as_dict('bar', 'foo') print(my_dict) # 输出: {'bar': True, 'foo': False}
然而,由于 locals() 在函数内部调用时只返回函数内部的局部变量,以上方法在实际使用中可能会有局限性。另一种方法是利用函数的 globals() 函数:
def get_variable_names_as_dict(*variable_names): caller_globals = globals() return {name: caller_globals[name] for name in variable_names} # 定义你的变量 bar = True foo = False # 调用函数获取字典 my_dict = get_variable_names_as_dict('bar', 'foo') print(my_dict) # 输出: {'bar': True, 'foo': False}
如果你想自动获取所有局部变量,可以使用以下方法:
def get_all_locals_as_dict(): return {k: v for k, v in globals().items() if not k.startswith('_') and not callable(v)} # 定义你的变量 bar = True foo = False baz = 42 # 获取所有局部变量 my_dict = get_all_locals_as_dict() print(my_dict) # 输出: {'bar': True, 'foo': False, 'baz': 42}
这样,你可以避免手动列出变量名,而是自动获取所有符合条件的变量。如果你只想获取某些特定的变量,可以修改过滤条件。