Переменные замыкания находятся в атрибуте __closure__
функции .Вы можете проверить это напрямую, но, вероятно, самый простой подход - использовать inspect.getclosurevars
для выполнения тяжелой работы за вас:
import inspect
def factory(param):
def f(num):
print(param*num)
return f
fun = factory('a')
print(inspect.getclosurevars(fun))
, которая выводит (точное содержимое globals
иbuiltins
будет отличаться на практике):
ClosureVars(nonlocals={'param': 'a'}, globals={}, builtins={'print': <built-in function print>}, unbound=set())
или чтобы ограничить его материалами, которые непосредственно просматриваются во вложенных неглобальных, не встроенных областях, обратитесь к атрибуту nonlocals
, который является dict
отображение имен на закрытое по значению:
>>> print(inspect.getclosurevars(fun).nonlocals)
{'param': 'a'}