hashlib digest() fails typecheck for variable-length digests SHAKE-128 and SHAKE-256 #16480
Copy link
Copy link
Closed
Labels
stubs: false negativeType checkers do not report an error, but shouldType checkers do not report an error, but shouldstubs: false positiveType checkers report false errorsType checkers report false errors
Description
the hashlib package supports variable-length digests SHAKE-128 and SHAKE-256. For those objects, digest() and hexdigest() both need to take a length parameter, without which they fail missing required argument 'length' (pos 1). (other digest algorithms know their own output length and do not require (or accept) an argument to these functions).
However, the typechecker insists that it's wrong to pass that length argument in this case:
0 dkg@bob:~/src/test$ cat hashlib-typing.py
#!/usr/bin/python3
import hashlib
h = hashlib.new("SHAKE-128")
h.update(b'')
print(h.hexdigest(16))
print(h.hexdigest())
0 dkg@bob:~/src/test$ mypy --strict hashlib-typing.py
hashlib-typing.py:6: error: Too many arguments for "hexdigest" of "HASH" [call-arg]
Found 1 error in 1 file (checked 1 source file)
1 dkg@bob:~/src/test$ ./hashlib-typing.py
7f9c2ba4e88f827d616045507605853e
Traceback (most recent call last):
File "/home/dkg/src/test/./hashlib-typing.py", line 7, in <module>
print(h.hexdigest())
~~~~~~~~~~~^^
TypeError: hexdigest() missing required argument 'length' (pos 1)
1 dkg@bob:~/src/test$
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
stubs: false negativeType checkers do not report an error, but shouldType checkers do not report an error, but shouldstubs: false positiveType checkers report false errorsType checkers report false errors
Activity
srittau commentedon Oct 5, 2026
The problem is the Liskov Substitution Principle violation of the
HASHsubclasses.HASH.hexdigest()doesn't take parameter, but some of the sub-classes do. I think the best solution to this problem is adding a stubs-only protocol that mimics theHASHAPI, but with an optional length argument (and documentation that this either exists or doesn't exist based on the exact class). And then add overloads tonew()to return specific sub-classes for specific algorithms.