- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请注意,我问这个问题仅供引用
我知道标题听起来像 Finding the source code for built-in Python functions? 的重复项。但让我解释一下。
比如说,我想找到collections.Counter
类的most_common
方法的源代码。由于 Counter
类是在 python 中实现的,我可以使用 inspect
模块获取它的源代码。
即,
>>> import inspect
>>> import collections
>>> print(inspect.getsource(collections.Counter.most_common))
这将打印
def most_common(self, n=None):
'''List the n most common elements and their counts from the most
common to the least. If n is None, then list all element counts.
>>> Counter('abcdeabcdabcaba').most_common(3)
[('a', 5), ('b', 4), ('c', 3)]
'''
# Emulate Bag.sortedByCount from Smalltalk
if n is None:
return sorted(self.items(), key=_itemgetter(1), reverse=True)
return _heapq.nlargest(n, self.items(), key=_itemgetter(1))
因此,如果方法或类是用 C 实现的,inspect.getsource
将引发 TypeError
。
>>> my_list = []
>>> print(inspect.getsource(my_list.append))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\abdul.niyas\AppData\Local\Programs\Python\Python36-32\lib\inspect.py", line 968, in getsource
lines, lnum = getsourcelines(object)
File "C:\Users\abdul.niyas\AppData\Local\Programs\Python\Python36-32\lib\inspect.py", line 955, in getsourcelines
lines, lnum = findsource(object)
File "C:\Users\abdul.niyas\AppData\Local\Programs\Python\Python36-32\lib\inspect.py", line 768, in findsource
file = getsourcefile(object)
File "C:\Users\abdul.niyas\AppData\Local\Programs\Python\Python36-32\lib\inspect.py", line 684, in getsourcefile
filename = getfile(object)
File "C:\Users\abdul.niyas\AppData\Local\Programs\Python\Python36-32\lib\inspect.py", line 666, in getfile
'function, traceback, frame, or code object'.format(object))
TypeError: <built-in method append of list object at 0x00D3A378> is not a module, class, method, function, traceback, frame, or code object.
所以我的问题是,有没有什么方法(或使用第三方包?)我们也可以找到用 C 实现的类或方法的源代码?
即,类似这样的事情
>> print(some_how_or_some_custom_package([].append))
int
PyList_Append(PyObject *op, PyObject *newitem)
{
if (PyList_Check(op) && (newitem != NULL))
return app1((PyListObject *)op, newitem);
PyErr_BadInternalCall();
return -1;
}
最佳答案
不,没有。 Python 无法提供可让您找到原始源文件的元数据。此类元数据必须由 Python 开发人员显式创建,而对于其实现的效果没有明确的好处。
首先,绝大多数 Python 安装不包含 C 源代码。其次,虽然您可以想象,Python 语言的用户能够阅读 Python 源代码,但 Python 的用户群非常广泛,其中很大一部分人不了解 C 或对 C 代码的工作原理感兴趣,最后,即使是开发人员知道 C 不能指望必须阅读 Python C API documentation如果您想了解 Python 代码库,这很快就会成为一项要求。
与 Python 字节码缓存文件和脚本不同,C 文件不会直接映射到特定的输出文件。除非您使用符号表创建调试版本,否则编译器不会在其输出的生成的目标文件 (.o
) 中保留源文件名,链接器也不会记录 .o
文件进入它产生的结果。并非所有 C 文件最终都会生成相同的可执行文件或动态共享对象文件;有些成为 Python 二进制文件的一部分,另一些成为可加载扩展,并且组合是可配置的,并且取决于编译时可用的外部库。
在 makefile、setup.py
和 C 预压缩器宏之间,输入文件的组合以及实际用于创建每个输出文件的源代码行也有所不同。最后但并非最不重要的一点是,由于在运行时不再查阅 C 源文件,因此不能期望它们在相同的原始位置仍然可用,因此即使存储了一些元数据,您仍然无法将其映射回原来的。
因此,只需记住一些有关 Python C-API 如何工作的基本规则,然后通过一些明智的代码搜索将其映射回 C 代码,就更容易。
或者,下载 Python 源代码并创建调试版本,并使用良好的 IDE 来帮助您将符号等映射回源文件。不同的编译器、平台和 IDE 有不同的支持符号表进行调试的方法。
关于python-3.x - 寻找用 C 实现的方法的源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52968628/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!