有没有方法写一个函数,能打印出传入变量的名称?

有没有方法写一个函数,能打印出传入变量的名称?,第1张

有没有方法写一个函数,能打印出传入变量的名称?,第2张

def show_var_info(var):
    # TODO return varName, varType, varContent
    varName = ???
    varType = type(var)
    print(f'{varName} {varType} {varContent}')
    

abc = 'test_content'
show_var_info(abc)

# Wish result:
# abc <class 'str'> test_content
  • 有办法实现嘛?
  • 试了一下在函数内部只能得到 var 这个变量名。
  • 但传入的时候打一遍变量,再打一遍名称,又不是太完美。
  • 而且需要包成可复用的函数。
----------------------- 以下是精选回复-----------------------

答:不能,除非语言内部有一些这样的工具(我觉得多半是没有,你可以尝试自己挖掘 call stack 信息,但是一般来说这是一个很糟糕的想法)。

最简单的想法:var 的值所来自的表达式并不非要是一个变量表达式。
答:在 globals()/locals()里找可以嘛,类似 list(globals().keys())[list(globals().values()).index(abc)],有重复的再改改…
答:def func1(para):
global_dirc = globals().copy()
for each in global_dirc.keys():
if global_dirc[each] is para:
return each,type(para),para
return -1

话说你投错区了吧,你这写法好像是 js。。。。
答:3.8 的 f-strings
https://docs.python.org/3.8/whatsnew/3.8.html#f-strings-support-for-self-documenting-expressions-and-debugging
答:可以说一下你的 X 问题吗?这个 Y 大家都觉得很奇怪
答:提供思路

第一步:通过 callstack 得到调用函数的那句话所在的源文件和行号。
第二部:通过 ast 解析调用的语句。
第三部:你已经拿到所有需要的信息了,可以输出了。
答:没有别的方法。看起来楼主你是从 C/C++ 转过来的,因为常见语言估计也只有 C/C++ 的宏能很简单地做到这件事情了。
答:函数的参数有些时候是表达式,比如 fun(1),这个时候 1 只是一个值。
答:混淆以后就没意义了
答:3.8 的 f string 新特性
答:也许这个设计是你想要的东西,一般 debug 的时候,比如 Django,报错之后输出的是调用栈和每一层调用的 locals,这样的形式也是很清晰的,不过也是没有表达式的,只有变量。
答:之前也有过这个需求,so 上也有答案,但觉得不是自己想要的解决方案,所以把自己需求改了。
答:猛地一看还以为问的是 inspect.signature + vars() 的映射题...

仔细一想, 以前还真写过类似的装饰器, 通过 sys._getframe(stack_level).f_locals 在栈信息里找到所有局部变量, 然后与上面的 signature 一一对应就可以拿到了, 有点复杂, 不想写

解题思路:
sys._getframe(stack_level).f_locals 拿到当前函数外面的原是函数的 locals 变量, 然后与 inspect.signature 里一一对应, 得到变量的名称.
inspect.signature 是很详细的函数内省, 包括了变量的 type hints, 是否为 position only, 是否为 keyword only 等等
答:稍微看了眼评论... 为啥不用 PySnooper 呢?

以及 Python3.8 尽量别升, 旧项目很多不向后兼容的 deprecated issue, 需要升级依赖的库, 比如 abc 相关的 lxml 和
aiohttp. 如果是 Windows, 那 pip 的时候缺少 whl, 所以要本地编译, 很蛋疼. 如果开了 Travis CI 和 github 的 workflow 做测试, 直接报错 3.8 环境无法安装, 缺少安装源
答:https://paste.ofcode.org/q5sXkHhp6vPKZXaNYMuFNR

又写了一个,直接读取文件,然后正则表达式找一下,因为会找到很多所以就封装一个 class 记录是第几次调用查找函数。。。。不过,StackOverflow 找到的答案说这种需求是无意义且不现实的。
答:是不是可以故意写个异常,然后在 catch 里面获取 callstack 找到调用时的语句,然后解析出变量名?

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 有没有方法写一个函数,能打印出传入变量的名称?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情