Index: Lib/doctest.py =================================================================== --- Lib/doctest.py (revision 67009) +++ Lib/doctest.py (working copy) @@ -815,17 +815,6 @@ elif module is None: module = inspect.getmodule(obj) - # Read the module's source code. This is used by - # DocTestFinder._find_lineno to find the line number for a - # given object's docstring. - try: - file = inspect.getsourcefile(obj) or inspect.getfile(obj) - source_lines = linecache.getlines(file) - if not source_lines: - source_lines = None - except TypeError: - source_lines = None - # Initialize globals, and merge in extraglobs. if globs is None: if module is None: @@ -837,6 +826,20 @@ if extraglobs is not None: globs.update(extraglobs) + # Read the module's source code. This is used by + # DocTestFinder._find_lineno to find the line number for a + # given object's docstring. + try: + if hasattr(obj, '__file__') and obj.__file__ is None and module: + file = module.__name__ + '.py' + else: + file = inspect.getsourcefile(obj) or inspect.getfile(obj) + source_lines = linecache.getlines(file, globs) + if not source_lines: + source_lines = None + except TypeError: + source_lines = None + # Recursively expore `obj`, extracting DocTests. tests = [] self._find(tests, obj, name, module, source_lines, globs, {}) @@ -961,7 +964,7 @@ if module is None: filename = None else: - filename = getattr(module, '__file__', module.__name__) + filename = getattr(module, '__file__', None) or module.__name__ if filename[-4:] in (".pyc", ".pyo"): filename = filename[:-1] return self._parser.get_doctest(docstring, globs, name,