Частичные функции «официально» выбираются? - PullRequest
1 голос
/ 13 октября 2019

Мне нужно создать набор функций partial, которые можно мариновать. Эмпирически проверяя это, кажется, работает нормально:

import pickle
import functools

pickle.dumps(functools.partial(int, base=2))
# b'\x80\x03cfunctools\npartial\nq\x00cbuiltins\nint\nq\x01\x85q\x02Rq\x03(h\x01)}q\x04X\x04\x00\x00\x00baseq\x05K\x02sNtq\x06b.'

Однако это явно не указано в документации, и данная "примерно эквивалентная" функция functools.partial() не являетсяpicklable.

Могу ли я предположить, что объекты partial можно выбирать при любых обстоятельствах (без крайних случаев, независимо от реализации C / Python)?

1 Ответ

1 голос
/ 13 октября 2019

Фрагмент кода в документации, имитирующей функцию partial(), не выбирается, поскольку он использует вложенную функцию. Тем не менее, официальный functools.partial() реализован с использованием class, который можно выбрать: cpython/functools.py#L234

Официальный трекер проблем Python содержит несколько ссылок на partial объектов, не подлежащих крушению,и это считается ошибкой:

Кроме того, существуют модульные тесты для проверки возможности выбора объектов partial: cpython/test_functools.py#L244

Журнал изменений дляPython 3.6 содержит ссылку на возможность выбора объектов functools.partial:

bpo-27137 : чистая резервная реализация Python для functools.partial теперь соответствует поведению своего ускоренного аналога Cдля создания подклассов, травления и представления текста.

По этим причинам, я думаю, можно смело предположить, что возможность выбора partial не является деталью реализации и на нее можно положиться.

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