0

私は何気なくPythonモジュールhashlibを読んでいます。ドキュメントから、hashlib.md5() を使用して md5 を呼び出すことができることがわかります。そのコードはどのように機能するのだろうか?hashlib.pyソース コードでは、おそらく md5 で呼び出されるように見えますが__get_builtin_constructor、コードがどのように機能するかはわかりません。はい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)

関数は、openssl の可用性に応じてまたは のいずれかに__get_hashマップされます。__get_builtin_constructor__get_openssl_constructor

openssl が利用できないとしましょう。これは、それがどのように見えるかです...

for __func_name 行は、のキーを反復します

__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')

そして、モジュール スコープ (globals()) 内のそれぞれへの参照を追加します。を呼び出すとhashlib.md5()、最初に使用されます

66 def __get_builtin_constructor(name):

返される callable を定義します。md5返品の場合

73             return _md5.new

返されるのは callable であるため、 の後の括弧のために呼び出しが行われhashlib.md5ます。

于 2013-07-31T04:04:16.380 に答える