В Python 2 (не уверен насчет 3) словарь locals обновляется только тогда, когда вы действительно вызываете locals (). Так, например,
l=locals()
x=2
l['x']
терпит неудачу, потому что l
не содержит ключа "x", но
l=locals()
x=2
locals()
l['x']
возвращает 2.
Я ищу способ принудительно обновить словарь местных жителей, но хитрость в том, что я нахожусь в другом фрейме стека. Так, например, Я хочу сделать
l=locals()
x=2
force_update()
l['x']
и мне нужно написать функцию force_update()
. Я знаю, что с помощью указанной функции я могу получить родительский фрейм через inspect.currentframe().f_back
и даже родительские (не обновленные) локальные переменные через inspect.currentframe().f_back.f_locals
, но как я могу принудительно выполнить обновление?
Если это кажется запутанным, моя главная цель - написать функцию, которая является сокращением для "{some} string".format(**dict(globals(),**locals()))
, чтобы мне не приходилось каждый раз вводить ее, и вместо этого я могу сделать fmt("{some} string")
. При этом я столкнулся с проблемой, описанной выше.
Изменить: с ответом Марджина ниже, по сути, это решение, которое я искал. Можно поиграться с тем, как именно они получают фрейм стека вызываемого объекта, здесь я делаю это через partial
.
from functools import partial
from inspect import currentframe
fmt = partial(lambda s,f: s.format(**dict(globals(),**f.f_locals)),f=currentframe())
x=2
print fmt("{x}") #prints "2"
.format(**dict(globals(),**locals()))
. Многие редакторы поддерживают что-то подобное. - person Roland Smith   schedule 17.04.2016"{some} string".format(**dict(globals(),**locals()))
в своем коде? Действительно ли вашей строке формата нужен доступ ко всем переменным в локальном и глобальном пространствах имен? - person Thomas Nelson   schedule 17.04.2016sys._getframe(1)
), тогда зачем вамglobals()
иlocals()
? - person cdarke   schedule 17.04.2016