ссылка на переменную в другой функции? - PullRequest
1 голос
/ 03 сентября 2011

Я опытный разработчик TCL и пишу свои собственные процедуры, чтобы помочь себе в этом. то есть Процедура, которую я вызываю putVar, выводит значение переменной в определенном формате, поэтому я знаю, какая это переменная и какое значение имеет значение «set foo 1; putVar foo» Result 'foo = "1"' Я хотел бы сделать то же самое в Python, но не нашел ответа :(. В TCL я использую команду upvar, так как я передаю имя переменной, затем я 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"

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Вы можете, но не должны.Если ваш код нуждается в , значит, что-то не так с вашим дизайном, и вам, вероятно, следует использовать явно переданные словари или объекты с соответствующими атрибутами.

Но, чтобы ответить на вопрос напрямую:Вы можете использовать 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()
0 голосов
/ 03 сентября 2011

Возможно, я не на 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...