2016-11-14 48 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中明確處理的。 –