Ich frage mich, wo ich die Quelle finden zu zeigen, wie der Operator ** ist in Python implementiert. Kann jemand mich in die richtige Richtung?
Wie wird ** in Python implementiert?
Es ist die Macht Operator
python.org doc - Netzbetreiber
Edit: Oh, dingt, der Code, richtig. Hoffe, dass die Verbindung hilft immer noch. Sloppy Lese aus meinem Teil
Es gibt zwei verschiedene Implementationen für int (long in 3.0) Objekte und eine weitere für Schwimmer Objekte.
Der Schwimmer ist die pow float_pow (PyObject * v, w * PyObject, PyObject * z) in Funktion definiert Objekte / floatobject.c Datei der Python Quellcode. Diese Funktion ruft pow () von C stdlib der math.h
Die int pow hat seine eigene Implementierung ist die Funktion int_pow (PyIntObject * v, w * PyIntObject, PyIntObject * z), definiert in Objekten / intobject.c (longobject.c für 3.0) des Python Quellcodes.

Die Python - Grammatik - Definition (aus denen der Parser erzeugt wird , unter Verwendung von pgen ), suchen Sie nach 'Power': Gramar / Gramar
Die Python ast, sucht 'ast_for_power': Python / ast.c
Die Python eval Schleife, sucht 'BINARY_POWER': Python / ceval.c
Welche Anrufe PyNumber_Power (implementiert in Objekte / 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 ruft den pow Schlitz. Für lange Gegenstände (der einzige Standard - Integer - Typ in 3.0) diese in dem long_pow Funktion implementiert sind Objekte / longobject.c , für int Objekte (in den Zweigen 2.x) ist es in der int_pow Funktion implementiert Objekt / intobject.c
Wenn Sie in long_pow graben, können Sie sehen, dass nach den Argumenten vetting und ein bisschen eingerichtet tun, kann das Herz der Potenzierung siehe hier:
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)
}
}
}
Welche verwendet Algorithmen diskutiert in Kapitel 14.6 des Handbook of Applied Cryptography , die für beliebiger Genauigkeit arithmetische effiziente Potenzierung Algorithmen beschreibt.
Ich denke, caseysrandomthoughts über Sternchen an Funktionen Definition fragen.
Sie könnten Antwort auf diese Python doc Seite finden: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions
Wenn ein endgültiger formaler Parameter der Form ** name vorhanden ist, erhält er ein Wörterbuch alle Keyword-Argumente mit Ausnahme diejenigen enthält, zu einem formalen Parameter entsprechen.
Ich habe Sau Beschreibung dieses Zeug woanders zu Python doc, aber ich kann nicht erinnern.