diff --git a/IPython/core/completerlib.py b/IPython/core/completerlib.py index 3c66d73..eeb39a4 100644 --- a/IPython/core/completerlib.py +++ b/IPython/core/completerlib.py @@ -165,7 +165,7 @@ def try_import(mod: str, only_modules=False) -> List[str]: except: return [] - m_is_init = hasattr(m, '__file__') and '__init__' in m.__file__ + m_is_init = '__init__' in (getattr(m, '__file__', '') or '') completions = [] if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init: diff --git a/IPython/core/tests/test_completerlib.py b/IPython/core/tests/test_completerlib.py index 6e2a540..fe54668 100644 --- a/IPython/core/tests/test_completerlib.py +++ b/IPython/core/tests/test_completerlib.py @@ -16,7 +16,7 @@ from os.path import join import nose.tools as nt -from IPython.core.completerlib import magic_run_completer, module_completion +from IPython.core.completerlib import magic_run_completer, module_completion, try_import from IPython.utils.tempdir import TemporaryDirectory from IPython.testing.decorators import onlyif_unicode_paths @@ -159,3 +159,20 @@ def test_bad_module_all(): nt.assert_is_instance(r, str) finally: sys.path.remove(testsdir) + + +def test_module_without_init(): + """ + Test module without __init__.py. + + https://github.com/ipython/ipython/issues/11226 + """ + fake_module_name = "foo" + with TemporaryDirectory() as tmpdir: + sys.path.insert(0, tmpdir) + try: + os.makedirs(os.path.join(tmpdir, fake_module_name)) + s = try_import(mod=fake_module_name) + assert s == [] + finally: + sys.path.remove(tmpdir)