Python全局模块

时间:2013-07-31 03:59:59

标签: python

我正在随便阅读Python模块hashlib。从文档中我看到我可以使用hashlib.md5()来调用md5。我想知道代码是如何工作的?在hashlib.py source code中,我觉得__get_builtin_constructor可能会被md5调用,但我不知道代码是如何工作的。是的,我可以看到为md5定义__all__,但它是如何实现的?

1 个答案:

答案 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之后由于括号而进行调用。