如何在python源代码中找到运算符的定义?

由于这个SO问题,我开始对python中的“in”( __contains__ ?)运算符的实现感到好奇。 我下载了源代码并尝试grep,浏览等来找到它的一些基本定义,但我没有成功。 有人能告诉我一种找到它的方法吗?

当然,寻找这种东西的一般方法是最好的,这样像我这样的人都可以学习下次钓鱼。

我使用的是2.7,但如果3.x的过程完全不同,那么使用这两种技术会很好。


我认为这个实现从Objects/abstract.c中的PySequence_Contains开始。 我通过查看Modules/operator.coperator.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?

下一篇: Add tinymce to new textarea dynamically