Переменная закрытия разыменования Python во время определения - PullRequest
1 голос
/ 04 апреля 2019

Ответ в в этом посте подробно описывает, как внутренние функции python не используют значение переменных замыкания до тех пор, пока внутренняя функция не выполнится, найдя имя переменной в соответствующей области видимости.

Например:

funcs = [(lambda: x) for x in range(3)]

Вызов любого из сгенерированных лямбд возвращает 2:

>>> funcs[0]()
2
>>> funcs[1]()
2
>>> funcs[2]()
2

Есть ли способ заставить значение x быть определенным, когда функция определена, а не когда она выполняется позже? В приведенном выше примере мой желаемый вывод равен 0, 1, 2, соответственно.

Более конкретно, мой сценарий использования - предоставить пользователям API возможность удобно превращать пользовательскую функцию в поток с помощью декоратора. Например:

for idx in range(3):
    @thread_this(name=f'thread_{idx}')
    def custom():
        do_something()
        print(f'thread_{idx} complete.')

Когда выполняется последний оператор печати, он получает значение current , равное idx, в глобальной области видимости. При наличии соответствующих операторов сна все 3 потока выведут 'thread_2 complete.'

1 Ответ

0 голосов
/ 04 апреля 2019

Вы можете использовать functools.partial, первая проблема может быть решена с помощью

funcs = [functools.partial(lambda x: x, x) for x in xrange(3)]

Это даст вам желаемый результат. Однако я не мог понять второй вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...