Python打印变量名(属性名)及其值

在导入包后, 往往想要打印出包的版本, 如:

1
2
import torch
import torchvision

想要打印出:

1
2
torch.__version__: 2.0.1+cu117
torchvision.__version__: 0.15.2+cu117

但如果像下面这样写, 就太不优雅了:

1
2
print(f"torch.__version__: {torch.__version__}")
print(f"torchvision.__version__: {torchvision.__version__}")

也就是在代码里, 每想查看一个包的版本号, 实际上要写两遍__version__属性名, 一个用于打印普通字符串, 一个用于取属性值.

有没有这样一个函数, 把变量名(或属性名)传进去, 就能打印出名称: 值的字符串呢?

我在网上搜索这个问题, 找到了解决办法, 并根据同样的思路, 写了一个自己的版本.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import re
import inspect

def print_name_and_value(variable_a):
    """
    打印变量名(传递给函数的实参名), 及其值
    """
    current_func_info = inspect.getframeinfo(inspect.currentframe().f_back)
    codes: list = current_func_info[3]  # 取得code_context, 也就是调用该函数的那行代码的文本
    r_list = re.findall(r'\bprint_name_and_value\(\s*(.*?)\s*\)', codes[0], re.S)
    # \b, 单词的边界
    # \s, 任何一个空白字符(等价于`[\f\n\r\t\v]`)
    # re.S, 包括换行符在内的任意字符
    if r_list:
        print(f"{r_list[0]}: {variable_a}")
        # return (r_list[0], variable_a)
    
    return None

运行函数:

1
2
print_name_and_value(torch.__version__)
print_name_and_value(torchvision.__version__)

函数运行后, print_name_and_value函数拿到调用它的那行代码的原文, 然后用正则表达式从中取出函数名后面那个括号里的内容.

上述代码我暂时只在Jupyter里进行了测试.


2023 年 7 月 11 日 更新:

属实是我孤陋寡闻了, Python 3.8 中, f-strings 新增了 = 说明符, 如果想要以 表达式文本 = 表达式的值 的形式打印文本, 只需要这样来写(以 torch.__version__ 为例):

1
2
3
import torch

print(f"{torch.__version__ = }")

运行结果为:

torch.__version__ = '2.0.1'