Python编译器/解析器中FloorDivide的定义/源代码在哪里?

时间:2016-11-14 19:18:02

标签: python parsing

我搜索了FloorDiv甚至Div,Add,Sub等定义的代码,但我没有像我想要的那样定义。

在Python / ast.c中:

case DOUBLESLASH:
    return FloorDiv;
case '/':
        if (STR(n)[1] == '/')
            return FloorDiv;
        else
            return Div;

在Python / compile.c中:

 case BINARY_FLOOR_DIVIDE:
    case BINARY_TRUE_DIVIDE:
        return -1;
    case INPLACE_FLOOR_DIVIDE:
    case INPLACE_TRUE_DIVIDE:
        return -1;

在Parser / Python.asdl中:

operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift
             | RShift | BitOr | BitXor | BitAnd | FloorDiv

语法/语法:

arith_expr: term (('+'|'-') term)*
term: factor (('*'|'@'|'/'|'%'|'//') factor)*

http://eli.thegreenplace.net/2010/06/30/python-internals-adding-a-new-statement-to-python/帮助我找到了这些地方但不是我想要的地方。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您是否在询问CPython源代码中的实际楼层划分操作的定义?在这种情况下,它位于文件Objects/longobject.c

static PyObject *
long_div(PyObject *a, PyObject *b)
{
    PyLongObject *div;

    CHECK_BINOP(a, b);
    if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0)
        div = NULL;
    return (PyObject *)div;
}

该函数依次调用l_divmod(),您也可以在该文件中找到该定义。

这实际上是针对Python 3中的int类型,但由于历史原因,该文件名为longobject.c。请注意,__floordiv__//)等方法是按类定义的,因此上述内容仅适用于整数。要查找浮点数的代码,请参阅float_floor_div()中的Objects/floatobject.c