ссылка на переменную в другой функции?

1

Я опытный разработчик 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"
  • 0
    Мы перешли от динамического обзора по причине. Мы также не рассматриваем строки как код всякий раз, когда этого можно избежать, опять же по причине.
Теги:
variables

2 ответа

1

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

Но, чтобы ответить на вопрос напрямую: вы можете использовать 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
    Абосулеты это идея. Я использую его для внутренней отладки на лету, без необходимости вводить все «красивые вещи», чтобы увидеть, какое значение установлено. Я видел некоторые другие посты, где вы можете «установить» значение, используя тот же механизм, что, я думаю, вероятно, плохая идея. Просто простая функция, которая печатает некоторую информацию, когда у меня есть несколько переменных, которые я могу наблюдать. Спасибо за ответ
  • 0
    Использование sys._getframe () лучше? более прямой совместимость, чем использование проверки?
Показать ещё 1 комментарий
0

Возможно, я не на 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"
  • 3
    Я бы сделал def printVar (var, var_name): print "{0} = {1}". Формат (var_name, repr (var))
  • 0
    @XavierCombelle: Вы также можете использовать {1!r} для этого.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню