如何获取传递给函数的变量的原始名称

99 投票
13 回答
65325 浏览
提问于 2025-04-15 22:14

有没有办法获取传递给函数的变量的原始名称?比如:

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

你不能这样做。因为它在传给函数之前就已经被计算过了。你能做的就是把它当作字符串传递过去。

撰写回答