Действительно ли возможно добраться, исходное имя переменной переменной передало функции? Например.
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()
.. и имейте функцию, генерируют имя файла с названия переменной, переданной ему.
Я предполагаю, не ли возможно, что я должен буду просто передать переменную и имя переменной как строка каждый раз.
Вы не можете. Он оценивается перед передачей в функцию. Все, что вы можете сделать, это передать его как строку.
Если вы хотите установить отношение пары значений ключей, может быть, было бы лучше использовать словарь?
... или, если вы пытаетесь создать некоторую автодокументиру из своего кода, возможно, что-то вроде Doxygen (http://www.doxygen.nl/) может сделать эту работу за вас?
РЕДАКТИРОВАТЬ: Чтобы прояснить, я не рекомендую использовать это ВООБЩЕ, он сломается, это беспорядок, он вам ни в чем не поможет, но его можно использовать в развлекательных / образовательных целях.
Вы можете взломать модуль 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']
Похоже, Иво обыграл меня, чтобы проверить
, но вот еще одна реализация:
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'
Мораль: не делай этого.