diff --git a/bpython/inspection.py b/bpython/inspection.py index fe1e3a0a..2b734cdf 100644 --- a/bpython/inspection.py +++ b/bpython/inspection.py @@ -289,9 +289,13 @@ def getfuncprops(func: str, f: Callable) -> Optional[FuncProps]: return None try: argspec = _get_argspec_from_signature(f) - fprops = FuncProps( - func, _fix_default_values(f, argspec), is_bound_method - ) + try: + argspec = _fix_default_values(f, argspec) + except KeyError as ex: + # Parsing of the source failed. If f has a __signature__, we trust it. + if not hasattr(f, "__signature__"): + raise ex + fprops = FuncProps(func, argspec, is_bound_method) except (TypeError, KeyError, ValueError): argspec_pydoc = _getpydocspec(f) if argspec_pydoc is None: diff --git a/bpython/test/test_repl.py b/bpython/test/test_repl.py index 74f4b721..8c3b85cc 100644 --- a/bpython/test/test_repl.py +++ b/bpython/test/test_repl.py @@ -1,5 +1,6 @@ import collections import inspect +import os import socket import sys import tempfile @@ -523,13 +524,19 @@ def __init__(self, *args, **kwargs): inspect.Parameter("pinetree", inspect.Parameter.KEYWORD_ONLY), ]) """ - for line in code.split("\n"): - print(line[8:]) - self.repl.push(line[8:]) + code = [x[8:] for x in code.split("\n")] + for line in code: + self.repl.push(line) - self.assertTrue(self.repl.complete()) - self.assertTrue(hasattr(self.repl.matches_iter, "matches")) - self.assertEqual(self.repl.matches_iter.matches, ["apple2=", "apple="]) + with mock.patch( + "bpython.inspection.inspect.getsourcelines", + return_value=(code, None), + ): + self.assertTrue(self.repl.complete()) + self.assertTrue(hasattr(self.repl.matches_iter, "matches")) + self.assertEqual( + self.repl.matches_iter.matches, ["apple2=", "apple="] + ) if __name__ == "__main__":