如何获取传递给函数的变量的原始名称
有没有办法获取传递给函数的变量的原始名称?比如:
foobar = "foo"
def func(var):
print var.origname
这样的话:
func(foobar)
会返回:
foobar
我想做一个这样的函数:
def log(soup):
f = open(varname+'.html', 'w')
print >>f, soup.prettify()
f.close()
希望这个函数能根据传入的变量名称生成文件名。
我想如果不行的话,我只能每次都把变量和变量名作为字符串一起传过去了。
13 个回答
26
为了补充一下Michael Mrozek的回答,你可以通过以下方式提取具体的参数,而不是完整的代码:
import re
import traceback
def func(var):
stack = traceback.extract_stack()
filename, lineno, function_name, code = stack[-2]
vars_name = re.compile(r'\((.*?)\).*$').search(code).groups()[0]
print vars_name
return
foobar = "foo"
func(foobar)
# PRINTS: foobar
113
编辑:为了让大家明白,我完全不推荐这样做,这样做会出问题,搞得一团糟,根本帮不了你,但如果是为了娱乐或学习,倒是可以试试。
你可以尝试使用 inspect
模块,我不推荐这样做,但你可以试试看……
import inspect
def foo(a, f, b):
frame = inspect.currentframe()
frame = inspect.getouterframes(frame)[1]
string = inspect.getframeinfo(frame[0]).code_context[0].strip()
args = string[string.find('(') + 1:-1].split(',')
names = []
for i in args:
if i.find('=') != -1:
names.append(i.split('=')[1].strip())
else:
names.append(i)
print names
def main():
e = 1
c = 2
foo(e, 1000, b = c)
main()
输出:
['e', '1000', 'c']
13
你不能这样做。因为它在传给函数之前就已经被计算过了。你能做的就是把它当作字符串传递过去。