在 Python 中获取变量名作为字符串

在 Python 中以字符串形式获取变量名

Get a variable’s name as a string in Python

获取字符串形式的变量名:

  1. 使用格式化字符串文字获取变量的名称和值。
  2. 在等号处拆分字符串。
  3. 访问索引处的列表项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'
变量后面的等号用于调试,返回变量名及其值。

表达式扩展为:

  1. 等号前的文本。
  2. 一个等号。
  3. 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() 获取变量的名称作为字符串

获取字符串形式的变量名:

  1. 使用该globals()函数获取实现当前模块命名空间的字典。
  2. 遍历字典以获取匹配变量的名称。
  3. 访问索引处的列表项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()函数返回一个包含单个变量名的列表。

发表评论