New issue 3099: "TypeError: reload() argument must be module" when object is instance of types.ModuleType child class https://bitbucket.org/pypy/pypy/issues/3099/typeerror-reload-argument-must-be-module
Kirill Smelkov: Hello up there. I’ve hit another compatibility bug compared to CPython2.7 when using lazy module imports \(either [https://pypi.org/project/Importing/](https://pypi.org/project/Importing/) or [https://pypi.org/project/lazy-import/](https://pypi.org/project/lazy-import/)\). Please consider the following minimal example which demonstrates the problem: \(mymod.py\) ``` print 'mymod loaded' def test(): print 'mymod.test' ``` \(test.py\) ```python import types import sys #MyModType = types.ModuleType class MyModType(types.ModuleType): pass x_mymod = MyModType('mymod') sys.modules['mymod'] = x_mymod import mymod assert mymod is x_mymod print 'reload ...' reload(mymod) print 'access ...' mymod.test() ``` When run with CPython 2.7 `reload(mymod)` works ok: ``` $ /usr/bin/python --version Python 2.7.16 $ /usr/bin/python test.py reload ... mymod loaded access ... mymod.test ``` However when run with PyPy 2.7-7.2 it breaks on the `reload`: ``` $ pypy --version Python 2.7.13 (4a68d8d3d2fc, Oct 10 2019, 06:43:13) [PyPy 7.2.0 with GCC 6.2.0 20160901] $ pypy test.py reload ... Traceback (most recent call last): File "test.py", line 15, in <module> reload(mymod) TypeError: reload() argument must be module ``` I use `peak.utils.imports.whenImported(X)` to automatically apply enhancements my library comes with, if/when third-party software is used. It is a pity that it breaks with PyPy. Thanks beforehand, Kirill _______________________________________________ pypy-issue mailing list pypy-issue@python.org https://mail.python.org/mailman/listinfo/pypy-issue