Python可以打印函数定义吗?

Edd*_*ker 95 python

在JavaScript中,可以打印出函数的定义.有没有办法在Python中实现这一目标?

(只是在交互模式下玩,我想读一个没有打开的模块().我只是很好奇).

Tri*_*ych 134

如果要导入该功能,可以使用inspect.getsource:

>>> import re
>>> import inspect
>>> print inspect.getsource(re.compile)
def compile(pattern, flags=0):
    "Compile a regular expression pattern, returning a pattern object."
    return _compile(pattern, flags)
Run Code Online (Sandbox Code Playgroud)

在交互式提示中起作用,但显然仅适用于导入的对象(不是交互式提示中定义的对象).当然,只有Python可以找到源代码(因此不能在内置对象,C库,.pyc文件等上),它才会起作用.

  • 那么打印我之前在当前交互式Python解释器中定义的函数定义呢?这可能吗? (7认同)

Pet*_*ter 91

如果您正在使用iPython,您可以使用它function_name?来获取帮助,并且function_name??如果可以,将打印出来源.

  • +1,ipython太棒了!你可以添加一个链接:http://ipython.scipy.org/ (4认同)
  • 有时您需要将函数分成另一行来调用?例如model.function?不起作用,但是f = model.function; F??作品 (2认同)

Mik*_*rns 9

虽然我一般都认为这inspect是一个很好的答案,但我不同意你无法获得解释器中定义的对象的源代码.如果使用dill.source.getsourcefrom dill,则可以获取函数和lambdas的来源,即使它们是以交互方式定义的.它还可以从curries中定义的绑定或非绑定类方法和函数中获取代码...但是,如果没有封闭对象的代码,您可能无法编译该代码.

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 7

这是我弄清楚如何做到这一点的方式:

    import inspect as i
    import sys
    sys.stdout.write(i.getsource(MyFunction))
Run Code Online (Sandbox Code Playgroud)

这将取出新行字符并很好地打印出该函数

  • 为什么使用 sys.stdout.write() 而不是 print() ? (3认同)
  • 破碎的例子,它应该是 i.getsource(MyFunction)。 (2认同)

Saf*_*wan 5

help(function)得到的功能说明。

您可以help() 在此处阅读更多信息。

  • 没有在帮助中为我定义来源。 (2认同)