Wie wird ** in Python implementiert?

Ich frage mich, wo finde ich die Quelle zu zeigen, wie der Operator ** in Python implementiert ist. Kann mir jemand in die richtige Richtung zeigen?

4 Solutions collect form web for “Wie wird ** in Python implementiert?”

Die Python-Grammatik-Definition (von der der Parser mit pgen erzeugt wird ), suche nach 'power': Gramar / Gramar

Die Python ast, suche nach 'ast_for_power': Python / ast.c

Die Python-Eval-Schleife, suche nach 'BINARY_POWER': Python / ceval.c

Welche Aufruf PyNumber_Power (implementiert in Objects / abstract.c ):

PyObject * PyNumber_Power(PyObject *v, PyObject *w, PyObject *z) { return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()"); } 

Im Wesentlichen rufen Sie den Steckplatz auf. Für lange Objekte (der einzige Standard-Integer-Typ in 3.0) ist dies in der long_pow-Funktion Objects / longobject.c implementiert , für int-Objekte (in den 2.x-Zweigen) ist es in der int_pow-Funktion Object / intobject.c implementiert

Wenn Sie in long_pow graben, können Sie sehen, dass nach dem Vetting die Argumente und ein bisschen Setup, das Herz der Exponentiation kann hier sehen:

 if (Py_SIZE(b) <= FIVEARY_CUTOFF) { /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */ /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */ for (i = Py_SIZE(b) - 1; i >= 0; --i) { digit bi = b->ob_digit[i]; for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) { MULT(z, z, z) if (bi & j) MULT(z, a, z) } } } else { /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */ Py_INCREF(z); /* still holds 1L */ table[0] = z; for (i = 1; i < 32; ++i) MULT(table[i-1], a, table[i]) for (i = Py_SIZE(b) - 1; i >= 0; --i) { const digit bi = b->ob_digit[i]; for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) { const int index = (bi >> j) & 0x1f; for (k = 0; k < 5; ++k) MULT(z, z, z) if (index) MULT(z, table[index], z) } } } 

Welches Algorithmen verwendet, die in Kapitel 14.6 des Handbuchs der angewandten Kryptographie diskutiert werden, die effiziente Exponentiierungsalgorithmen für beliebige Präzisionsarithmetik beschreibt.

Es ist die Macht zum Betreiber

Python.org doc – Kraftfahrer

Bearbeiten: Oh, dang, der Code, richtig. Hoffe, der Link hilft immer noch. Schlampig lesen von meinem Teil

Ich denke, caseysrandomthoughts fragen nach asterisks bei Funktionen Definition.

Du könntest Antwort auf dieser Python doc Seite finden: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

Wenn ein endgültiger formaler Parameter des Formular ** -Namen vorhanden ist, erhält er ein Wörterbuch, das alle Keyword-Argumente enthält, mit Ausnahme derjenigen, die einem formalen Parameter entsprechen.

Ich sage Beschreibung dieses Zeug irgendwo anders bei Python doc, aber ich kann mich nicht erinnern.

Es gibt zwei verschiedene Implementierungen eins für int (long in 3.0) Objekte und eine andere für float Objekte.

Der float_pow (PyObject * v, PyObject * w, PyObject * z) Funktion definiert in Objects / floatobject.c Datei des Python Quellcodes. Diese Funktion ruft pow () von C stdlib's math.h auf

Der int pow hat seine eigene Implementierung, ist die Funktion int_pow (PyIntObject * v, PyIntObject * w, PyIntObject * z) definiert in Objects / intobject.c (longobject.c für 3.0) des Python-Quellcodes.

Python ist die beste Programmiersprache der Welt.