@@ -2015,6 +2015,27 @@ zlib_crc32_combine_impl(PyObject *module, unsigned int crc1,
20152015 return crc32_combine (crc1 , crc2 , len );
20162016}
20172017
2018+ static PyObject *
2019+ zlib_getattr (PyObject * self , PyObject * args )
2020+ {
2021+ PyObject * name ;
2022+ if (!PyArg_UnpackTuple (args , "__getattr__" , 1 , 1 , & name )) {
2023+ return NULL ;
2024+ }
2025+
2026+ if (PyUnicode_Check (name ) && PyUnicode_EqualToUTF8 (name , "__version__" )) {
2027+ if (PyErr_WarnEx (PyExc_DeprecationWarning ,
2028+ "'__version__' is deprecated and slated for removal in Python 3.20" ,
2029+ 1 ) < 0 ) {
2030+ return NULL ;
2031+ }
2032+ return PyUnicode_FromString ("1.0" );
2033+ }
2034+
2035+ PyErr_Format (PyExc_AttributeError , "module 'zlib' has no attribute %R" , name );
2036+ return NULL ;
2037+ }
2038+
20182039static PyMethodDef zlib_methods [] =
20192040{
20202041 ZLIB_ADLER32_METHODDEF
@@ -2025,6 +2046,7 @@ static PyMethodDef zlib_methods[] =
20252046 ZLIB_CRC32_COMBINE_METHODDEF
20262047 ZLIB_DECOMPRESS_METHODDEF
20272048 ZLIB_DECOMPRESSOBJ_METHODDEF
2049+ {"__getattr__" , zlib_getattr , METH_VARARGS , "Module __getattr__" },
20282050 {NULL , NULL }
20292051};
20302052
@@ -2221,9 +2243,6 @@ zlib_exec(PyObject *mod)
22212243 return -1 ;
22222244 }
22232245#endif
2224- if (PyModule_AddStringConstant (mod , "__version__" , "1.0" ) < 0 ) {
2225- return -1 ;
2226- }
22272246 return 0 ;
22282247}
22292248
0 commit comments