Я понимаю, что эти методы предназначены для травления/распиловки и не имеют никакого отношения к сокращенной встроенной функции, но какая разница между 2 и почему нам нужны оба?
В чем разница между __reduce__ и __reduce_ex__?
Ответ 1
Документы говорят, что
Если это предусмотрено, во время травления
__reduce__()будет вызываться без аргументы, и он должен вернуть либо строка или кортеж.
С другой стороны,
Иногда полезно знать версии протокола при реализации
__reduce__. Это можно сделать реализация метода с именем__reduce_ex__вместо__reduce__.__reduce_ex__, когда существует, называется предпочтительнее__reduce__(вы все равно можете предоставить__reduce__для назад совместимость).__reduce_ex__метод будет вызываться с одним целочисленный аргумент, протокол версия.
На захватной руке Гвидо говорит, что это область, которую можно очистить.
Ответ 2
__reduce_ex__ - это то, что __reduce__ должно было быть, но не стало. __reduce_ex__ работает как __reduce__, но протокол pickle передается.