Как получить параметры заводских функций - PullRequest
2 голосов
/ 02 апреля 2019

Предполагая, что у меня есть код в Python 3.5

def factory(param):
    def f(num):
        print(param*num)
    return f

fun = factory('a')
# how do I know, that fun was created with param='a'?
fun(3)

Как я могу проверить значение param после создания fun?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Переменные замыкания находятся в атрибуте __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'}
1 голос
/ 02 апреля 2019

Вы можете проверить закрытие этой функции с помощью атрибута __closure__:

>>> fun.__closure__[0].cell_contents
'a'
...