Python 怎么获取函数参数的字面量?

2017 年 11 月 7 日
 vtoexsir

def get_var_literal(var):
var_literal=? # 怎么获取到 var 的字面量?
print(var_literal)
s = 'abc'
get_var_literal(s)
#=>s 希望能打印出 s,而不是打印出来 abc

6590 次点击
所在节点    Python
33 条回复
crazycabbage
2017 年 11 月 7 日
def get_variable_name(s):
loc = locals()
print loc
for key in loc:
if loc[key] == s:
return key
sagaxu
2017 年 11 月 7 日
这个 name 不一定存在啊,get_var_literal(foo())
ipwx
2017 年 11 月 7 日
你的这个需求是很别扭的,建议用别的设计。
est
2017 年 11 月 7 日
最喜欢这种扯蛋的问题了

import inspect
inspect.getargspec(get_var_literal).args
est
2017 年 11 月 7 日
貌似我审题错误。LZ 自己去翻 inspect 吧
vtoexsir
2017 年 11 月 7 日
@crazycabbage
"if loc[key] == s:" #这里的 s 不是固定不变的
我的本意是:获取函数的实参的字面值。比如,传递 a 这个参数,就返回 a 这个字符串;传递 b 这个参数,就返回 b 这个字符串,而不管 a 和 b 自身是什么类型,也不管是什么具体的值,只获取实参的字面量
ipwx
2017 年 11 月 7 日
@vtoexsir 你这事情有方法做,但是你得写很多代码,而且必须源代码 .py 存在,而不是 .pyc 。首先,拿到 stacktrace,找到调用你这个函数的代码的行号。然后,用 ast 去分析那一行代码。最后,你拿到了字面量。

然而何必呢?我看不出来 Python 里面搞这一套的意义。换个设计不是更好?
alber1986
2017 年 11 月 7 日
看看 Python 视频教程就懂了
http://www.sucaihuo.com/video/172-2-0
vtoexsir
2017 年 11 月 7 日
@est inspect.getargspec(get_var_literal).args # 这是获取形参的字面值,不是实参的字面值
不过非常感谢,inspection 可能会有戏解决这个问题!
crazycabbage
2017 年 11 月 7 日
a=123
loc = locals()

def get_variable_name(s):
...print loc
...for key in loc:
......if loc[key] == s:
.........return key

print get_variable_name(a)
lrxiao
2017 年 11 月 7 日
@crazycabbage
用 locals 不太好
不如 loc = sys._getframe(1)
lrxiao
2017 年 11 月 7 日
loc = sys._getframe(1).f_locals
qsnow6
2017 年 11 月 7 日
>>> def foo(**kwargs):
for arg_name in kwargs:
return kwargs[arg_name], arg_name


>>> foo(fib=1)
(1, 'fib')
qsnow6
2017 年 11 月 7 日
jmc891205
2017 年 11 月 7 日
请问为什么会有这样的需求啊
Kilerd
2017 年 11 月 7 日
用装饰器,先把抓到的变量读取 __name__ 再传进去
qsnow6
2017 年 11 月 7 日
Kilerd
2017 年 11 月 7 日
emmm, 试了下除非使用 kwargs 的方式穿进去,不然都无解
SuperMild
2017 年 11 月 7 日
楼主是想在没有源码的情况下分析源码?

如果有源码,想不到在程序里分析参数名称的用处。
SuperMild
2017 年 11 月 7 日
还不如直接分析源码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/404184

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX