Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python源代码中找到运算符的定义?_Python - Fatal编程技术网

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

如何在python源代码中找到运算符的定义?,python,Python,由于以下原因,我对python中“in”(\uuuu-contains\uu?)运算符的实现感到好奇。我下载了源代码,并尝试grep、browse等来查找它的一些基本定义,但没有成功。有人能告诉我怎么找到它吗 当然,找到这种东西的一般方法是最好的,这样像我这样的人就可以学会下次钓鱼了 我使用的是2.7,但是如果3.x的过程完全不同,那么最好同时使用这两种技术。我认为实现从PySequence\u包含的开始。我通过查看in的实现找到了它,它将所有本机运算符封装在Python函数中。基于Inerad

由于以下原因,我对python中“in”(
\uuuu-contains\uu
?)运算符的实现感到好奇。我下载了源代码,并尝试grep、browse等来查找它的一些基本定义,但没有成功。有人能告诉我怎么找到它吗

当然,找到这种东西的一般方法是最好的,这样像我这样的人就可以学会下次钓鱼了


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

我认为实现从
PySequence\u包含的
开始。我通过查看in的实现找到了它,它将所有本机运算符封装在Python函数中。

基于Ineradial向正确方向的推动,下面是我深入研究它的方法。任何关于更好的方法的反馈都将不胜感激

ack --type=cc __contains__
通向接线员

spam2(contains,__contains__,
 "contains(a, b) -- Same as b in a (note reversed operands).")
将“contains”重命名为“op_contains” 进而指向PySequence_包含的(不在此文件中)

引向abstract.c中的定义(仅以下返回)

这导致了_PySequence _IterSearch(只是下面的比较)

这将导致PyObject_RichCompareBool(不在此文件中)

引出object.c中的定义,在这里我最终找到了比较的实现,即在实际的相等性检查之前进行身份检查(我最初关于比较的问题)


我有另一台电脑上的PyCharm,我现在无法访问。我想我可以用它来查找定义,直到找到某个基本引用,但是没有这样的查找工具,有没有办法做到这一点呢?现在尝试跟踪兔子洞。我以前发现过PySequence_Contains,但不知道其摘要。c和operator.c是查找定义的地方。我自己怎么能弄明白呢?只要知道python源代码的组织结构就行了?@yakiimo我通过执行
ack--type=cc contains
找到了
operator.c
。(立即停止使用
grep
搜索源代码。)@yakiimo要遵循的假设思路是,
中的
是一个操作符,所有操作符在
操作符
模块中都有一个包装器。查看该模块的文档,找出函数的名称,然后在源代码中找到该模块的实现,并在该文件中搜索包装器函数的名称。这种思路的问题在于,它假定“所有操作员在操作员模块中都有一个包装器”,而我不知道这一点。还是我遗漏了什么?我经常用在这类事情上。能够在特定上下文中搜索字符串,而不仅仅是搜索任何事件,这会有很大帮助。在负侧,cScice只适用于C和C++(以及java)。
ack --type=cc PySequence_Contains
result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
ack --type=cc PyObject_RichCompareBool
/* 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;
}