0

我正在随便阅读 Python 模块hashlib。从我看到的文档中,我可以使用 hashlib.md5() 来调用 md5。我想知道该代码是如何工作的?在hashlib.py 源代码中,在我看来__get_builtin_constructor可能是用 md5 调用的,但我不知道代码是如何工作的。是的,我可以看到md5定义为__all__但它是如何到达那里的?

4

1 回答 1

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

于 2013-07-31T04:04:16.380 回答