8

简而言之,假设我有一个字符串'next'

next = "123rpq"

我可以将一种str方法.isdigit()应用于'next'. 所以我的问题是如何检查这个方法的实现。因此,是否有类似inspect.getsource(somefunction)获取“方法”的源代码的事情?

更新:请参阅下面关于变量名称的评论'next'

4

5 回答 5

10

对于模块、类、函数和一些其他对象,您可以使用inspect.getfileinspect.getsourcefile. 但是,对于内置对象和方法,这将导致TypeError. 正如 C0deH4cker 所提到的,内置对象和方法是用 C 实现的,因此您必须浏览 C 源代码。isdigit是内置字符串对象的一个​​方法,在Python源码目录下的文件stringobject.c中实现。Objects这个isdigits方法是从这个文件的第 3392 行实现的。另请参阅我在此处对类似但更一般的问题的回答。

于 2012-06-28T22:54:47.067 回答
7

isdigit()您正在谈论的方法是内置数据类型的内置方法。意思是,此方法的源代码是用 C 编写的,而不是 Python。如果你真的想看它的源代码,那么我建议你去http://python.org下载 Python 的源代码。

于 2012-06-28T22:54:30.540 回答
0

您可以尝试打印method.__doc__有关该特定方法的文档。如果你只是好奇,你可以检查你的 PYTHONPATH 看看你的模块是从哪里导入的,看看你是否从那个模块中找到了 .py 文件

于 2012-06-28T22:49:15.540 回答
0

我检查了cpython源代码,isdigit已经是ac stdlib函数。这令人满意地解释了它 https://www.quora.com/How-does-isdigit-in-Python-work 你可以做的是下载 python 源代码和 c stdlib 头文件并编写脚本(bash 或 py)到搜索功能(无论它是什么类型)和 isdigit(无论您搜索什么)在同一行或附近。

顺便说一句,我想知道如果我们部分编译并将代码与 aasembly 相关联会发生什么。人工智能是否能够通过比较马尔可夫链中的程序集来缩短或扩展我们的代码。人工智能辅助编码可能吗?

于 2020-06-24T12:18:55.610 回答
-1

虽然我通常同意这inspect是一个很好的答案,但当您的类(以及类方法)在解释器中定义时,它就会变得平淡无奇。

如果您使用dill.source.getsourcefrom dill,您可以获得函数和 lambda 的来源,即使它们是交互式定义的。它还可以从 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

>>> 

对于builtin函数或方法,dill.source将不起作用……但是……

您可能仍然不必求助于使用您最喜欢的编辑器来打开其中包含源代码的文件(如其他答案中所建议的那样)。有一个名为的新包cinspect声称能够查看builtins.

于 2015-01-22T15:53:25.073 回答