2016-11-14 8 views
1

FloorDivやDiv、Add、Subなどが定義されているコードを検索しますが、私が望むような定義はありません。パイソン/ compile.cでPythonどこにコンパイラ/パーサのFloorDivideの定義/ソースコードがありますか?

case DOUBLESLASH: 
    return FloorDiv; 

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

:パーサ/ Python.asdlで

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

:パイソン/ ast.cで

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で扱われます。 –

関連する問題