Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to use typehint for hashlib.sha256() #2928

Closed
JohnVillalovos opened this issue Apr 22, 2019 · 5 comments
Closed

Unable to use typehint for hashlib.sha256() #2928

JohnVillalovos opened this issue Apr 22, 2019 · 5 comments

Comments

@JohnVillalovos
Copy link
Contributor

  • Are you reporting a bug, or opening a feature request?
    Bug

  • Please insert below the code you are checking with mypy,

#!/usr/bin/python3 -ttu
import hashlib
import sys

def main() -> int:
    m = hashlib.sha256()
    print("type:", type(m.digest()))
    print("len:", len(m.digest()))
    print("sizeof:", sys.getsizeof(m))
    print("type:", type(m))
    print(hashlib._hashlib.HASH)
    reveal_type(m)

    return 0

def check_hash(hash_obj: hashlib._Hash) -> hashlib._Hash:
    hash_obj.update(b"0")
    return hash_obj


if '__main__' == __name__:
    sys.exit(main())
  • What is the actual behavior/output?
$ mypy tt.py
tt.py:11: error: Module has no attribute "_hashlib"
tt.py:12: error: Revealed type is 'hashlib._Hash'

$ ./tt.py
Traceback (most recent call last):
  File "./tt.py.save", line 17, in <module>
    def check_hash(hash_obj: hashlib._Hash) -> hashlib._Hash:
AttributeError: module 'hashlib' has no attribute '_Hash'
  • What is the behavior/output you expect?
    That mypy would understand hashlib._hashlib.HASH as a valid type OR that when running the code Python would not complain that there is no 'hashlib._Hash' attribute.

  • What are the versions of mypy and Python you are using?
    mypy 0.701
    Python 3.7.3 on Fedora 29

  • What are the mypy flags you are using? (For example --strict-optional)
    No flags used

When trying to use a type annotation in Python 3.7 for an object created with hashlib.sha256() I can not seem to find a combination that will work with both running it with Python and running mypy to validate the code. Please see above my results.

Note that mypy complains that it does not know about: hashlib._hashlib

And Python has an error as it can't find: hashlib._Hash

@srittau
Copy link
Collaborator

srittau commented Apr 30, 2019

hashlib._Hash is a stub-only construct. To use it in live code, either quote it, or use from __future__ import annotations to prevent processing at runtime.

@srittau srittau closed this as completed Apr 30, 2019
@christianbueno1
Copy link

christianbueno1 commented Nov 19, 2019

python 3.7
how do you realize that have to use _Hash in hashlib._Hash and how use annotations in this context, I am trying to be able use code completion in Pycharm. It is my code:

from __ future__ import annotations
import hashlib

my_var_hash: hashlib._Hash
my_var_hash = hashlib.sha256()

mypy doesn't show any error. I hope use code completion in pycharm i.e. with these functions : my_var_hash.update(b'lmao') or my_var_hash.hexdigest() . what are not taking into account?, thanks in advance.

@l0b0
Copy link

l0b0 commented Jun 14, 2022

This code passes both mypy --strict and pylint for dealing with an arbitrary hashing algorithm:

from random import choice
from typing import TYPE_CHECKING

from multihash import FUNCS, SHA2_256, SHA2_512

if TYPE_CHECKING:
    from hashlib import _Hash

hash_object: "_Hash" = FUNCS[choice([SHA2_256, SHA2_512])]()

@Ferdi265
Copy link

Ferdi265 commented Jun 25, 2024

I know this bug report is really old and already closed, but having the typing information for a library type be an expression that can't be used in regular Python (because the name doesn't actually exist in the module) is really ugly.

Is there precedence for behaviour like this in other Python modules? Is there a PEP that describes the rationale for this?

@JelleZijlstra
Copy link
Member

There are a few similar instances; you can find some of them by grepping for @type_check_only in typeshed.

There is no PEP explicitly discussing this case. In typeshed we do the best we do to type Python interfaces that often weren't originally designed with typing in mind. If you have a concrete proposal for how to make it better, you can share it and we can potentially change either CPython or typeshed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants