From 081bbf6b28868774c1abca0a8469a517abb9f6cc Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Fri, 26 Sep 2014 17:34:54 -0400 Subject: [PATCH] inspect: Fix getsource() to support decorated functions. Issue #1764286. Patch by Claudiu Popa. --- Lib/inspect.py | 1 + Lib/test/inspect_fodder2.py | 13 +++++++++++++ Lib/test/test_inspect.py | 3 +++ Misc/NEWS | 3 +++ 4 files changed, 20 insertions(+) diff --git a/Lib/inspect.py b/Lib/inspect.py index 819bb8de2d5..ae55347adc1 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -817,6 +817,7 @@ def getsourcelines(object): corresponding to the object and the line number indicates where in the original source file the first line of code was found. An OSError is raised if the source code cannot be retrieved.""" + object = unwrap(object) lines, lnum = findsource(object) if ismodule(object): return lines, 0 diff --git a/Lib/test/inspect_fodder2.py b/Lib/test/inspect_fodder2.py index bd7106fea86..e452235cd8e 100644 --- a/Lib/test/inspect_fodder2.py +++ b/Lib/test/inspect_fodder2.py @@ -109,3 +109,16 @@ def annotated(arg1: list): #line 109 def keyword_only_arg(*, arg): pass + +from functools import wraps + +def decorator(func): + @wraps(func) + def fake(): + return 42 + return fake + +#line 121 +@decorator +def real(): + return 20 diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 6da58227689..1da88c4ddb4 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -377,6 +377,9 @@ class TestDecorators(GetSourceBase): def test_replacing_decorator(self): self.assertSourceEqual(mod2.gone, 9, 10) + def test_getsource_unwrap(self): + self.assertSourceEqual(mod2.real, 122, 124) + class TestOneliners(GetSourceBase): fodderModule = mod2 def test_oneline_lambda(self): diff --git a/Misc/NEWS b/Misc/NEWS index ad539e39543..47fbafa70c0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: TBA Core and Builtins ----------------- +- Issue #1764286: Fix inspect.getsource() to support decorated functions. + Patch by Claudiu Popa. + - Issue #18554: os.__all__ includes posix functions. - Issue #21391: Use os.path.abspath in the shutil module.