检查Python解释器中的lambda代码

检查Python解释器中的lambda代码,python,lambda,ipython,inspect,Python,Lambda,Ipython,Inspect,以下是从更复杂的代码库中提取的简单python程序: #insp.py import inspect L = lambda x: x+1 print("L(10)=" + str(L(10))) code = inspect.getsource(L) print(code) 如果我从命令行以以下方式运行它,则它将正常工作: $ python insp.py 如果复制并粘贴python解释器中的每一行,则会失败: d:\>python Python 3.5.1 (v3.5.1:37a07

以下是从更复杂的代码库中提取的简单python程序:

#insp.py
import inspect
L = lambda x: x+1
print("L(10)=" + str(L(10)))
code = inspect.getsource(L)
print(code)
如果我从命令行以以下方式运行它,则它将正常工作:

$ python insp.py
如果复制并粘贴python解释器中的每一行,则会失败:

d:\>python
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import inspect
>>> L = lambda x: x+1
>>> print("L(10)=" + str(L(10)))
L(10)=11
>>> code = inspect.getsource(L)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "d:\Users\Cimino\AppData\Local\Programs\Python\Python35-32\Lib\inspect.py", line 944, in getsource
    lines, lnum = getsourcelines(object)
  File "d:\Users\Cimino\AppData\Local\Programs\Python\Python35-32\Lib\inspect.py", line 931, in getsourcelines
    lines, lnum = findsource(object)
  File "d:\Users\Cimino\AppData\Local\Programs\Python\Python35-32\Lib\inspect.py", line 762, in findsource
    raise OSError('could not get source code')
OSError: could not get source code
d:\>python
win32上的Python 3.5.1(v3.5.1:37A07CEE59692015年12月6日01:38:48)[MSC v.1900 32位(英特尔)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口检验
>>>L=λx:x+1
>>>打印(“L(10)=”+str(L(10)))
L(10)=11
>>>代码=inspect.getsource(L)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“d:\Users\Cimino\AppData\Local\Programs\Python\Python35-32\Lib\inspect.py”,第944行,在getsource中
行,lnum=getsourcelines(对象)
文件“d:\Users\Cimino\AppData\Local\Programs\Python\Python35-32\Lib\inspect.py”,第931行,在getsourcelines中
行,lnum=findsource(对象)
文件“d:\Users\Cimino\AppData\Local\Programs\Python\Python35-32\Lib\inspect.py”,第762行,位于findsource中
raise OSError('无法获取源代码')
OSError:无法获取源代码
注意,使用IPython而不是普通的Python解释器,它可以工作

有人知道为什么吗


我在Windows7下使用Python 3.5 32位。

它在IPython中工作,因为它缓存您使用模块输入的每个命令

例如:

$ ipy  ## Equivalent to ipython --classic
Python 2.7.10 (default, Jul 30 2016, 18:31:42)
Type "copyright", "credits" or "license" for more information.

IPython 3.0.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
>>> print a
Traceback (most recent call last):
  File "<ipython-input-1-9d7b17ad5387>", line 1, in <module>
    print a
NameError: name 'a' is not defined
找到与
L
相关的文件名的时间到了:

>>> L.func_code.co_filename
'<ipython-input-2-0c0d6f325784>'
因此,使用这些信息,IPython能够找到所需的源代码,但是pythonshell没有,因为它没有存储任何源代码



有关
inspect
如何获取源代码的相关详细信息可以在源代码中的和函数中找到。

我猜这是因为inspect模块实际上会去查找解释器跟踪的源文件。注意:接口还可以为您提供行号、定义前的注释等。当您在REPL中时,这些都不存在。我想IPython做了一些魔术来确保inspect在交互式情况下正确工作?如果我们想从解释器中的python对象以交互方式构建ast呢?似乎是一个严重的限制!
>>> import inspect
>>> L = lambda x: x+1
>>> code = inspect.getsource(L)
>>> L.func_code.co_filename
'<ipython-input-2-0c0d6f325784>'
>>> import linecache
>>> linecache.cache[L.func_code.co_filename]
(18, 1481047125.479239, [u'L = lambda x: x+1\n'], '<ipython-input-2-0c0d6f325784>')