Рассмотрим эту функцию:
def quux():
i = 42
print([i for x in [1]])
Результат: [42]
Поэтому я предполагаю, что локальные переменные видны в списках.
Теперь рассмотрим это:
def foo():
return currentframe().f_back.f_locals["i"]
def quux():
i = 42
print([foo() for x in [1]])
Результат:
KeyError: 'i'
При проверке кадров стека выясняется, что в него вставлен дополнительный стек.между кадрами для quux и foo:
{'x': 1, '.0': <tuple_iterator object at 0x7f59eb94c860>}
Хорошо, достаточно справедливо.Что меня озадачивает, так это то, почему первый пример видит i
.Если есть дополнительный фрейм стека, его не должно быть видно, не так ли?
И на более практических основаниях, как я могу получить фрейм стека вызывающей функции, независимо от того, была ли моя функция вызвана извне или из спискапонимание или, если на то пошло, из нескольких вложенных списков?