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

2024-06-28 19:41:50 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以获取传递给函数的变量的原始变量名?E、 g

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()

。。并让函数根据传递给它的变量名生成文件名。

我想如果不可能的话,我每次都要把变量和变量名作为字符串传递。


Tags: 函数log编辑foovardefhtmlopen
3条回答

编辑:为了说明这一点,我完全不建议使用它,它会崩溃,一团糟,无论如何也帮不了你,但它可以用于娱乐/教育目的。

你可以随意使用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']

不能。在传递给函数之前会对其求值。你所能做的就是把它当作字符串传递。

看起来Ivo比我强inspect,但这里有另一个实现:

import inspect

def varName(var):
    lcls = inspect.stack()[2][0].f_locals
    for name in lcls:
        if id(var) == id(lcls[name]):
            return name
    return None

def foo(x=None):
    lcl='not me'
    return varName(x)

def bar():
    lcl = 'hi'
    return foo(lcl)

bar()
# 'lcl'

当然,它可以被愚弄:

def baz():
    lcl = 'hi'
    x='hi'
    return foo(lcl)

baz()
# 'x'

寓意:不要这样做。

相关问题 更多 >