在导入包后, 往往想要打印出包的版本, 如:
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'