Как добраться, исходное имя переменной переменной передало функции

Действительно ли возможно добраться, исходное имя переменной переменной передало функции? Например.

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

.. и имейте функцию, генерируют имя файла с названия переменной, переданной ему.

Я предполагаю, не ли возможно, что я должен буду просто передать переменную и имя переменной как строка каждый раз.

45
задан Acorn 1 May 2010 в 12:03
поделиться

4 ответа

Вы не можете. Он оценивается перед передачей в функцию. Все, что вы можете сделать, это передать его как строку.

17
ответ дан 26 November 2019 в 21:05
поделиться

Если вы хотите установить отношение пары значений ключей, может быть, было бы лучше использовать словарь?

... или, если вы пытаетесь создать некоторую автодокументиру из своего кода, возможно, что-то вроде Doxygen (http://www.doxygen.nl/) может сделать эту работу за вас?

3
ответ дан 26 November 2019 в 21:05
поделиться

РЕДАКТИРОВАТЬ: Чтобы прояснить, я не рекомендую использовать это ВООБЩЕ, он сломается, это беспорядок, он вам ни в чем не поможет, но его можно использовать в развлекательных / образовательных целях.

Вы можете взломать модуль 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']
55
ответ дан 26 November 2019 в 21:05
поделиться

Похоже, Иво обыграл меня, чтобы проверить , но вот еще одна реализация:

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'

Мораль: не делай этого.

10
ответ дан 26 November 2019 в 21:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: