Decoders and encoders subclass PyDecoder and PyEncoder by radarhere · Pull Request #7801 · python-pillow/Pillow

register_decoder() and register_encoder() state that decoder/encoder are callables that return an object.

def register_decoder(name: str, decoder) -> None:
"""
Registers an image decoder. This function should not be
used in application code.
:param name: The name of the decoder
:param decoder: A callable(mode, args) that returns an
ImageFile.PyDecoder object

def register_encoder(name, encoder):
"""
Registers an image encoder. This function should not be
used in application code.
:param name: The name of the encoder
:param encoder: A callable(mode, args) that returns an
ImageFile.PyEncoder object

However, if you look at Pillow's source code, it is not a callable, it is just an object.

Image.register_decoder("BLP1", BLP1Decoder)
Image.register_decoder("BLP2", BLP2Decoder)
Image.register_save(BlpImageFile.format, _save)
Image.register_encoder("BLP", BLPEncoder)

Image.register_decoder("ppm", PpmDecoder)
Image.register_decoder("ppm_plain", PpmPlainDecoder)

Image.register_decoder("dds_rgb", DdsRgbDecoder)

Image.register_decoder("SGI16", SGI16Decoder)

This PR updates the docstrings, clarifies this by adding type hints, and updates the tests (which did treat the arguments as callables).