如何在Python源代码中查找运算符的定义?

8
由于这篇stackoverflow问答,我对Python中“in”(__contains__?)运算符的实现产生了兴趣。我下载了源代码并尝试使用grep、浏览等方式来找到其基本定义,但是一直没有成功。有人能告诉我如何找到它吗?
当然,一个通用的方法来寻找这种东西会更好,这样像我这样的人下次就可以自己搞定了。
我正在使用2.7版本,但如果3.x版本的过程完全不同,那么拥有两种技术会很好。

我有一台电脑上安装了PyCharm,但现在我无法访问它。我认为我可以使用它来查找定义,直到达到某个基本参考点,但是否有其他方法可以不使用这样的查找工具呢? - KobeJohn
2个回答

3

现在试图跟进那个兔子洞。我之前找到了PySequence_Contains,但不知道abstract.c和operator.c是找到定义的地方。我怎么能自己弄清楚呢?只需要了解Python源代码的组织结构吗? - KobeJohn
1
@yakiimo 我是通过运行 ack --type=cc contains 命令找到了 operator.c 文件的。(获取ack并停止使用 grep 来搜索源代码,就像现在这样。) - millimoose
@yakiimo 一个可以遵循的假设性思路是in是一个运算符,所有运算符在operator模块中都有一个包装器。查看该模块的文档以找出函数的名称,然后在源代码中找到该模块的实现,并在该文件中搜索包装器函数的名称。 - millimoose
我将把我的序列作为答案发布。如果您对如何改进它以帮助其他人有任何评论,请告诉我。 - KobeJohn
2
我经常使用cscope来进行这种操作。它可以帮助我们在特定的上下文中搜索字符串,而不仅仅是任意出现的字符串。但是,cscope只适用于C、C++(以及可能的Java)。 - jjlin
显示剩余2条评论

2

在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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接