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

时间:2012-02-01 01:58:27

标签: python

由于this SO question,我对python中“in”(__contains__?)运算符的实现感到好奇。我下载了源代码并试图grep,浏览等找到它的一些基本定义,但我还没有成功。有人能给我一个找到它的方法吗?

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

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

2 个答案:

答案 0 :(得分:2)

我认为实施工作始于Objects/abstract.c中的PySequence_Contains。我通过查看operator.containsModules/operator.c的实现找到了它,它在Python函数中包装了所有本机运算符。

答案 1 :(得分:2)

基于Inerdial向正确的方向发展,这是我如何挖掘它。任何有关更好的方法的反馈都将受到赞赏。

ack --type=cc __contains__

导致operator.c

spam2(contains,__contains__,
 "contains(a, b) -- Same as b in a (note reversed operands).")

将“包含”重命名为“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;
}