Last updated: Apr 9, 2024
Reading timeยท6 min
To print a variable's name:
print()
function to print the variable's name.site = 'bobbyhadz.com' result = f'{site=}' print(result) # ๐๏ธ site='bobbyhadz.com' # โ print variable name using f-string variable_name = f'{site=}'.split('=')[0] print(variable_name) # ๐๏ธ 'site'
We used a formatted string literal to get a variable's name as a string.
As shown in the code sample, the same approach can be used to print a variable's name and value.
f
.var1 = 'bobby' var2 = 'hadz' result = f'{var1}{var2}' print(result) # ๐๏ธ bobbyhadz
Make sure to wrap expressions in curly braces - {expression}
.
Formatted string literals also enable us to use the format specification mini-language in expression blocks.
site = 'bobbyhadz.com' result = f'{site=}' print(result) # ๐๏ธ site='bobbyhadz.com'
The equal sign after the variable is used for debugging and returns the variable's name and its value.
The expression expands to:
To get only the variable name, we have to split the string on the equal sign and return the first list item.
site = 'bobbyhadz.com' variable_name = f'{site=}'.split('=')[0] print(variable_name) # ๐๏ธ 'site'
The str.split() method splits the string into a list of substrings using a delimiter.
site = 'bobbyhadz.com' result = f'{site=}' print(result) # ๐๏ธ site='bobbyhadz.com' print(result.split('=')) # ๐๏ธ ['site', "'bobbyhadz.com'"]
The method takes the following 2 parameters:
Name | Description |
---|---|
separator | Split the string into substrings on each occurrence of the separator |
maxsplit | At most maxsplit splits are done (optional) |
You can use the str.join()
method if you need to join the variable's name and
value with a different separator.
website = 'bobbyhadz' result = ':'.join(f'{website=}'.split('=')) print(result) # ๐๏ธ website:'bobbyhadz'
The str.join() method takes an iterable as an argument and returns a string which is the concatenation of the strings in the iterable.
Alternatively, you can use the globals()
function.
This is a three-step process:
globals()
function to get a dictionary that implements the current
module namespace.def get_var_name(variable): globals_dict = globals() return [ var_name for var_name in globals_dict if globals_dict[var_name] is variable ] site = 'bobbyhadz.com' print(get_var_name(site)) # ๐๏ธ ['site'] print(get_var_name(site)[0]) # ๐๏ธ 'site'
You can tweak the function if you also need to get the value.
def get_variable_name_value(variable): globals_dict = globals() return [ f'{var_name}={globals_dict[var_name]}' for var_name in globals_dict if globals_dict[var_name] is variable ] website = 'bobbyhadz.com' # ๐๏ธ ['website=bobbyhadz.com'] print(get_variable_name_value(website)) # ๐๏ธ website=bobbyhadz.com print(get_variable_name_value(website)[0])
The globals function returns a dictionary that implements the current module namespace.
site = 'bobbyhadz.com' globals_dict = globals() # {'site': 'bobbyhadz.com', '__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f235932dde0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/borislav/Desktop/bobbyhadz_python/main.py', '__cached__': None, 'globals_dict': {...}} print(globals_dict)
We used a list comprehension to iterate over the dictionary.
site = 'bobbyhadz.com' globals_dict = globals() result = [key for key in globals_dict] # ['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'site', 'globals_dict'] print(result)
On each iteration, we check if the identity of the provided variable matches the identity of the current dictionary value.
def get_var_name(variable): globals_dict = globals() return [var_name for var_name in globals_dict if globals_dict[var_name] is variable] site = 'bobbyhadz.com' print(get_var_name(site)) # ๐๏ธ ['site'] print(get_var_name(site)[0]) # ๐๏ธ 'site'
The matching variable names (keys in the dictionary) get returned as a list.
If you have multiple variables with the same value, pointing to the same location in memory, the list would contain multiple variable names.
site = 'bobbyhadz.com' domain = 'bobbyhadz.com' def get_var_name(variable): globals_dict = globals() return [ var_name for var_name in globals_dict if globals_dict[var_name] is variable ] print(get_var_name(site)) # ๐๏ธ ['site', 'domain']
There are 2 variables with the same value and they point to the same location in memory, so the list returns 2 variable names.
If you pass non-primitive objects to the function, you'll get a list containing only one item because the objects are stored in different locations in memory.
class Employee(): pass alice = Employee() bobby = Employee() def get_var_name(variable): globals_dict = globals() return [ var_name for var_name in globals_dict if globals_dict[var_name] is variable ] print(get_var_name(alice)) # ๐๏ธ ['alice']
The two class instances are stored in different locations in memory, so the
get_var_name()
function returns a list containing a single variable name.
You can also use the locals()
dictionary to print a variable's names.
site = 'bobbyhadz.com' print(locals().items()) variable_name = [ key for key, value in locals().items() if value == 'bobbyhadz.com' ] print(variable_name) # ๐๏ธ ['site'] print(variable_name[0]) # ๐๏ธ site
The locals()
function returns a dictionary that contains the current scope's
local variables.
site = 'bobbyhadz.com' # {'site': 'bobbyhadz.com', '__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fe25e71f9d0>, '__spec__': None, '__annotations__': {}, # '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/borislav/Desktop/bobbyhadz_python/main.py', '__cached__': None} print(locals())
We used a list comprehension to print the variable that has a value of
bobbyhadz.com
.
This approach is similar to using the globals()
dictionary, however, the
locals()
function returns a dictionary that contains the current scope's local
variables, whereas the globals
dictionary contains the current module's
namespace.
Here is an example that demonstrates the difference between the globals()
and
the locals()
dictionaries.
global_site = 'bobbyhadz.com' def print_variable_name(): local_site = 'bobbyhadz.com' local_name = [ key for key, value in locals().items() if value == 'bobbyhadz.com' ] print(f'local_name {local_name}') # ----------------------------------------------- globals_dict = globals() global_name = [ var_name for var_name in globals_dict if globals_dict[var_name] == 'bobbyhadz.com' ] print(f'global_name {global_name}') # local_name ['local_site'] # global_name ['global_site'] print_variable_name()
The function uses the locals()
and globals()
dictionaries to print the name
of the variable that has a value of bobbyhadz.com
.
There is a variable with the specified value in the global and local scopes.
The locals()
dictionary prints the name of the local variable, whereas the
globals()
dictionary prints the name of the global variable.
An alternative approach is to store the variable's name as a value in a dictionary.
my_dict = { 'bobbyhadz': 'site', 'python': 'language', } print(my_dict['bobbyhadz']) # ๐๏ธ site print(my_dict['python']) # ๐๏ธ language
The code sample stores the values of the variables as keys in the dictionary and the names of the variables as values.
Here is an easier way to visualize this.
site = 'bobbyhadz' language = 'python' # ---------------------------------- my_dict = { 'bobbyhadz': 'site', 'python': 'language', } print(my_dict['bobbyhadz']) # ๐๏ธ site print(my_dict['python']) # ๐๏ธ language
The approach is similar to a reverse mapping.
By swapping the dictionary's keys and values, we can access variable names by values.
You can define a reusable function to make it more intuitive.
def get_name(dictionary, value): return dictionary[value] my_dict = { 'bobbyhadz': 'site', 'python': 'language', } print(get_name(my_dict, 'bobbyhadz')) # ๐๏ธ site print(get_name(my_dict, 'python')) # ๐๏ธ language
The function takes a dictionary and a value as parameters and returns the corresponding name.
I've also written an article on how to assign print output to a variable.
You can learn more about the related topics by checking out the following tutorials:
__main__
module in Path