繁体   English   中英

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

[英]How to find the definition of an operator in the python source code?

由于这个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).")

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM