Я опытный разработчик TCL и пишу собственные процедуры, чтобы помочь себе. т.е. proc я call putsVar, он печатает значение переменной в определенном формате, поэтому я знаю, какая переменная это и что значение "set foo 1; putsVar foo" Result 'foo = "1"' я ' d хотел бы сделать то же самое в python, но не найти ответ :( В TCL я использую команду upvar, так как я передаю имя переменной в, затем я поднимаю и вижу значение.
Я понимаю, что у python нет механизма типа upvar, но с его способностью к самоанализу я бы подумал, что это несколько тривиально, но я не нахожу ответа нигде.
Вот как я думаю, он должен работать:
def printVar(var):
valVar = "some mechanism to look up 1 level here to get value of var"
print str(var) + "=\"" + str(valVar) + "\""
x = "Hello"
printVar("x")
x="Hello"
и расширенный:
def foo():
y = "Hello World"
printVar("y")
foo()
y="Hello World"
Вы можете, но не должны. Если ваш код прямо нуждается в этом, то что-то не так с вашим дизайном, и вы, вероятно, должны использовать явно прошедшие словари или объекты с соответствующими атрибутами.
Но, чтобы ответить на вопрос напрямую: вы можете использовать sys._getframe
. Просто имейте в виду, что это может быть не переносимым в реализации Python (т.е. Работать только на CPython):
def get_object(name):
return sys._getframe(1).f_locals[name]
x = 'foo bar'
print get_object('x')
def foo():
y = 'baz baf'
print get_object('y')
foo()
Возможно, я не на 100% понятен, что вы хотите, но вы можете немного расширить printVar, чтобы передать имя переменной (как вы хотите ее распечатать), а также сама переменная.
def printVar(var, var_name):
print "{0} = {1}".format(var_name, var)
>>> x = 5
>>> printVar(x, "x")
x = 5
>>> y = "Hello"
>>> printVar(y, "y")
y = Hello
Насколько мне известно, нет хорошего способа получить строковое представление имени переменной. Вы должны будете предоставить его сами.
Я расширю его, чтобы соответствовать вашему примеру немного лучше:
def printVar(var, var_name):
if type(var) is type(str()):
print '{0} = "{1}"'.format(var_name, var)
else:
print '{0} = {1}'.format(var_name, var)
>>> printVar(x, "x")
x = 5
>>> printVar(y, "y")
y = "Hello"
{1!r}
для этого.