如何在python源代码中找到运算符的定义?
由于这个SO问题,我开始对python中的“in”( __contains__
?)运算符的实现感到好奇。 我下载了源代码并尝试grep,浏览等来找到它的一些基本定义,但我没有成功。 有人能告诉我一种找到它的方法吗?
当然,寻找这种东西的一般方法是最好的,这样像我这样的人都可以学习下次钓鱼。
我使用的是2.7,但如果3.x的过程完全不同,那么使用这两种技术会很好。
我认为这个实现从Objects/abstract.c
中的PySequence_Contains
开始。 我通过查看Modules/operator.c
的operator.contains
的实现来发现它,它将所有本地运算符封装在Python函数中。
基于Inerdial在正确方向上的推动,这里是我如何挖掘它。 任何反馈更好的方式去了解这一点,将不胜感激。
ack --type=cc __contains__
导致operator.c
spam2(contains,__contains__,
"contains(a, b) -- Same as b in a (note reversed operands).")
将“contains”重命名为“op_contains”,后者又指向PySequence_Contains(不在此文件中)
ack --type=cc PySequence_Contains
导致abstract.c中的定义(只是下面的返回)
result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
这导致_PySequence_IterSearch(只是下面的比较)
cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
这导致PyObject_RichCompareBool(不在此文件中)
ack --type=cc PyObject_RichCompareBool
导致在object.c中的定义,我最终发现在实际的相等性检查(我最初的关于比较的问题)之前进行身份检查的比较的实现。
/* Quick result when objects are the same.
Guarantees that identity implies equality. */
if (v == w) {
if (op == Py_EQ)
return 1;
else if (op == Py_NE)
return 0;
}
链接地址: http://www.djcxy.com/p/57313.html
上一篇: How to find the definition of an operator in the python source code?