2016-11-14 45 views
1

我搜索代码,其中FloorDiv甚至股利,ADD,SUB等的定义,但我没有定义,就像我想要的。Python其中是编译器/解析器中FloorDivide的定义/源代码?

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

在分析器/ 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/帮我找论文的地方,但不是我想要的。

回答

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

+0

谢谢!这是完美的答案! –

+0

只是另一个小问题,其中Cpython连接字符串 –

+0

看起来像Objects/unicodeobject.c(PyUnicode_Append)和Python/ceval.c(unicode_concatenate)的组合。无论出于什么原因(可能是性能),unicode类型都没有定义'__add__'或'__iadd__',但是这些都是在ceval中明确处理的。 –