Хотя вы не могли сделать это с кодом, написанным точно так, как указано, вы можете использовать inspect для получения нелокальных переменных. Обратите внимание на изменения звонка и возврата. Если вызывающая сторона является внешней областью вместо глобальной области видимости, предыдущий кадр будет f
.
import inspect
x = "global"
def f(x="nonlocal"):
def g():
x = "local"
print(x)
print(globals()["x"])
print(inspect.currentframe().f_back.f_locals["x"])
return g()
f()
Вывод
локальный
глобальный
нелокальный
Это может не помочь в данной конкретной ситуации c, это действительно зависит от того, насколько вы контролируете содержимое f
. Если у вас нет контроля над этим, вы также можете сделать обезьяну-патч f
. Многое зависит от контекста.