В чем разница между __reduce__ и __reduce_ex__?

Я понимаю, что эти методы предназначены для травления/распиловки и не имеют никакого отношения к сокращенной встроенной функции, но какая разница между 2 и почему нам нужны оба?

Ответы

Ответ 1

Документы говорят, что

Если это предусмотрено, во время травления __reduce__() будет вызываться без аргументы, и он должен вернуть либо строка или кортеж.

С другой стороны,

Иногда полезно знать версии протокола при реализации __reduce__. Это можно сделать реализация метода с именем __reduce_ex__ вместо __reduce__. __reduce_ex__, когда существует, называется предпочтительнее __reduce__ (вы все равно можете предоставить __reduce__ для назад совместимость). __reduce_ex__метод будет вызываться с одним целочисленный аргумент, протокол версия.

На захватной руке Гвидо говорит, что это область, которую можно очистить.

Ответ 2

__reduce_ex__ - это то, что __reduce__ должно было быть, но не стало. __reduce_ex__ работает как __reduce__, но протокол pickle передается.