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

2017-11-07 09:52:51 +08:00
 vtoexsir

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

5500 次点击
所在节点    Python
33 条回复
crazycabbage
2017-11-07 10:01:34 +08:00
def get_variable_name(s):
loc = locals()
print loc
for key in loc:
if loc[key] == s:
return key
sagaxu
2017-11-07 10:07:15 +08:00
这个 name 不一定存在啊,get_var_literal(foo())
ipwx
2017-11-07 10:13:25 +08:00
你的这个需求是很别扭的,建议用别的设计。
est
2017-11-07 10:14:05 +08:00
最喜欢这种扯蛋的问题了

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

然而何必呢?我看不出来 Python 里面搞这一套的意义。换个设计不是更好?
alber1986
2017-11-07 10:27:14 +08:00
看看 Python 视频教程就懂了
http://www.sucaihuo.com/video/172-2-0
vtoexsir
2017-11-07 10:33:31 +08:00
@est inspect.getargspec(get_var_literal).args # 这是获取形参的字面值,不是实参的字面值
不过非常感谢,inspection 可能会有戏解决这个问题!
crazycabbage
2017-11-07 10:38:57 +08:00
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-07 10:51:13 +08:00
@crazycabbage
用 locals 不太好
不如 loc = sys._getframe(1)
lrxiao
2017-11-07 10:51:52 +08:00
loc = sys._getframe(1).f_locals
qsnow6
2017-11-07 10:54:55 +08:00
>>> def foo(**kwargs):
for arg_name in kwargs:
return kwargs[arg_name], arg_name


>>> foo(fib=1)
(1, 'fib')
qsnow6
2017-11-07 11:06:52 +08:00
jmc891205
2017-11-07 11:11:42 +08:00
请问为什么会有这样的需求啊
Kilerd
2017-11-07 11:17:03 +08:00
用装饰器,先把抓到的变量读取 __name__ 再传进去
qsnow6
2017-11-07 11:17:09 +08:00
Kilerd
2017-11-07 11:20:11 +08:00
emmm, 试了下除非使用 kwargs 的方式穿进去,不然都无解
SuperMild
2017-11-07 11:26:40 +08:00
楼主是想在没有源码的情况下分析源码?

如果有源码,想不到在程序里分析参数名称的用处。
SuperMild
2017-11-07 11:27:26 +08:00
还不如直接分析源码

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

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

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

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

© 2021 V2EX