在 Python 中以字符串形式获取变量名
Get a variable’s name as a string in Python
获取字符串形式的变量名:
- 使用格式化字符串文字获取变量的名称和值。
- 在等号处拆分字符串。
- 访问索引处的列表项
0
以获取变量的名称。
主程序
website = 'bobbyhadz.com' result = f'{website=}' print(result) # 👉️ website='bobbyhadz.com' variable_name = f'{website=}'.split('=')[0] print(variable_name) # 👉️ 'website'
我们使用格式化的字符串文字来获取变量的名称作为字符串。
格式化字符串文字 (f-strings) 让我们通过在字符串前加上
f
.主程序
var1 = 'bobby' var2 = 'hadz' result = f'{var1}{var2}' print(result) # 👉️ bobbyhadz
确保将表达式括在大括号 –{expression}
中。
格式化字符串文字还使我们能够
在表达式块中使用格式规范迷你语言。
主程序
website = 'bobbyhadz.com' result = f'{website=}' print(result) # 👉️ website='bobbyhadz.com'
变量后面的等号用于调试,返回变量名及其值。
表达式扩展为:
- 等号前的文本。
- 一个等号。
repr()
使用计算的表达式调用函数的结果。
要仅获取变量名,我们必须在等号处拆分字符串并返回第一个列表项。
主程序
website = 'bobbyhadz.com' variable_name = f'{website=}'.split('=')[0] print(variable_name) # 👉️ 'website'
str.split ()
方法使用定界符将字符串拆分为子字符串列表。
主程序
website = 'bobbyhadz.com' # 👇️ ['website', "'bobbyhadz.com'"] print(f'{website=}'.split('='))
该方法采用以下 2 个参数:
姓名 | 描述 |
---|---|
分隔器 | 在每次出现分隔符时将字符串拆分为子字符串 |
最大分裂 | 最多maxsplit 完成拆分(可选) |
拆分字符串后,我们访问索引处的列表项0
以获取变量的名称。
或者,您可以使用该globals()
功能。
使用 globals() 获取变量的名称作为字符串
获取字符串形式的变量名:
- 使用该
globals()
函数获取实现当前模块命名空间的字典。 - 遍历字典以获取匹配变量的名称。
- 访问索引处的列表项
0
以获取变量的名称。
主程序
def get_variable_name(variable): globals_dict = globals() return [var_name for var_name in globals_dict if globals_dict[var_name] is variable] website = 'bobbyhadz.com' print(get_variable_name(website)) # 👉️ ['website'] print(get_variable_name(website)[0]) # 👉️ 'website'
globals函数返回一个实现当前模块命名空间的字典。
主程序
website = 'bobbyhadz.com' globals_dict = globals() # {'website': 'bobbyhadz.com', '__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f1a57b19de0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/borislav/Desktop/bobbyhadz_python/main.py', '__cached__': None, 'globals_dict': {...}} print(globals_dict)
我们使用列表理解来遍历字典。
主程序
website = 'bobbyhadz.com' globals_dict = globals() list_of_keys = [key for key in globals_dict] # 👇️ [ 'website', '__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'globals_dict'] print(list_of_keys)
列表推导用于对每个元素执行某些操作或选择满足条件的元素子集。
在每次迭代中,我们检查提供的变量的标识是否与当前字典值的标识相匹配。
主程序
def get_variable_name(variable): globals_dict = globals() return [var_name for var_name in globals_dict if globals_dict[var_name] is variable] website = 'bobbyhadz.com' print(get_variable_name(website)) # 👉️ ['website'] print(get_variable_name(website)[0]) # 👉️ 'website'
匹配的变量名称(字典中的键)作为列表返回。
如果您有多个具有相同值的变量,指向内存中的相同位置,则该列表将包含多个变量名称。
主程序
def get_variable_name(variable): globals_dict = globals() return [var_name for var_name in globals_dict if globals_dict[var_name] is variable] website = 'bobbyhadz.com' domain = 'bobbyhadz.com' print(get_variable_name(website)) # 👉️ ['website', 'domain'] print(get_variable_name(website)[0]) # 👉️ 'website'
有2个变量具有相同的值,指向内存中的相同位置,所以列表返回2个变量名。
如果将非原始对象传递给函数,您将得到一个仅包含一项的列表,因为这些对象存储在内存中的不同位置。
主程序
def get_variable_name(variable): globals_dict = globals() return [var_name for var_name in globals_dict if globals_dict[var_name] is variable] class Employee(): pass alice = Employee() bobby = Employee() print(get_variable_name(bobby)) # 👉️ ['bobby'] print(get_variable_name(bobby)[0]) # 👉️ 'bobby'
这两个类实例存储在内存中的不同位置,因此该
get_variable_name()
函数返回一个包含单个变量名的列表。