如何在不传入参数的情况下让Matrix类实例打印时显示变量名?
实现Matrix类打印时自动显示变量名的方案
不用传变量名参数也能做到,靠谱的方法是利用Python的inspect模块获取调用栈信息,反向查找指向当前矩阵实例的变量名,比爬代码文件靠谱多了。
直接上代码示例
import inspect class Matrix: def __init__(self, matrix_str): # 先把输入的字符串转成二维数组 self.data = [list(map(int, row.split('&'))) for row in matrix_str.split('@')] def _find_var_name(self): # 拿到调用print时的栈帧,跳过当前方法和__str__的栈帧 caller_frame = inspect.currentframe().f_back.f_back # 先查局部变量,再查全局变量 for name, obj in caller_frame.f_locals.items(): if obj is self: return name for name, obj in caller_frame.f_globals.items(): if obj is self: return name # 找不到就返回默认名 return "Unknown" def __str__(self): var_name = self._find_var_name() # 组装矩阵每一行的字符串 row_lines = [f" | {' '.join(map(str, row))} |" for row in self.data] # 拼接头部、矩阵行和尾部 header = f"---Matrix {var_name}---" footer = "-" * len(header) return '\n'.join([header] + row_lines + [footer]) # 测试一下 Bob = Matrix("2&3&4@4&5&6@6&7&8") print(Bob)
要注意的局限
- 如果同一个矩阵实例被多个变量引用,只会返回第一个找到的那个变量名。
- 在IPython这类交互式环境,或者嵌套函数、闭包这类复杂作用域里,可能找不到正确的变量名。
- 要是直接打印匿名实例(比如
print(Matrix("2&3&4"))),会显示"Unknown"。 - 性能上有一点点开销,但普通场景完全不用在意。
你说的爬代码文件的方法确实坑,不仅要处理各种代码结构干扰,代码打包或者动态生成的时候直接失效,完全没必要用。
内容的提问来源于stack exchange,提问作者Enormax
相关产品推荐
相关产品推荐

