我正在随便阅读Python模块hashlib。从文档中我看到我可以使用hashlib.md5()来调用md5。我想知道代码是如何工作的?在hashlib.py source code中,我觉得__get_builtin_constructor
可能会被md5调用,但我不知道代码是如何工作的。是的,我可以看到为md5
定义__all__
,但它是如何实现的?
答案 0 :(得分:3)
关键在于:
135 for __func_name in __always_supported:
136 # try them all, some may not work due to the OpenSSL
137 # version not supporting that algorithm.
138 try:
139 globals()[__func_name] = __get_hash(__func_name)
__get_hash
功能会映射到__get_builtin_constructor
或__get_openssl_constructor
,具体取决于openssl的可用性。
我们假设openssl不可用。这就是它的样子......
for __func_name行将迭代
的键__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
并且会在模块范围(globals())中添加对每个的引用。当您致电hashlib.md5()
时,首先使用
66 def __get_builtin_constructor(name):
定义返回的可调用对象。在md5
的情况下,它返回
73 return _md5.new
由于它是一个返回的可调用对象,因此在hashlib.md5
之后由于括号而进行调用。