Πώς ** υλοποιηθεί σε Python;

ψήφοι
11

Αναρωτιέμαι πού μπορώ να βρω την πηγή για να δείξει πώς ο χειριστής ** υλοποιείται σε Python. Μπορεί κάποιος να μου το σημείο προς τη σωστή κατεύθυνση;

Δημοσιεύθηκε 09/12/2008 στις 23:07
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
24

Ο ορισμός python γραμματική (από τα οποία το πρόγραμμα ανάλυσης δημιουργείται χρησιμοποιώντας pGEN ), ψάξτε για «εξουσία»: Gramar / Gramar

Η python AST, ψάξτε για 'ast_for_power': Python / ast.c

Η python eval βρόχου, ψάξτε για 'BINARY_POWER': Python / ceval.c

Ποια καλεί PyNumber_Power (εφαρμόζεται σε αντικείμενα / abstract.c ):

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

Ουσιαστικά, επικαλούνται την pow υποδοχή. Για μακριά αντικείμενα (το μόνο ακέραιος στο 3.0) αυτό υλοποιείται στη λειτουργία long_pow Αντικείμενα / longobject.c , για τα αντικείμενα int (στα κλαδιά 2.x) υλοποιείται στη λειτουργία int_pow Object / intobject.c

Αν σκάψει σε long_pow, μπορείτε να δείτε ότι μετά την εξέταση των επιχειρημάτων και να κάνει ένα κομμάτι της που έχει συσταθεί, η καρδιά της ύψωσης σε δύναμη μπορεί να δείτε εδώ:

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)
        }
    }
}

Το οποίο χρησιμοποιεί αλγόριθμους που συζητήθηκαν στο Κεφάλαιο 14.6 του Εγχειριδίου της Εφαρμοσμένης Κρυπτογραφίας που περιγράφει αποδοτικών αλγορίθμων ύψωση σε δύναμη για την αυθαίρετη αριθμητική ακρίβεια.

Απαντήθηκε 10/12/2008 στις 00:33
πηγή χρήστη

ψήφοι
1

Νομίζω ότι είναι caseysrandomthoughts ρωτάτε σχετικά με αστερίσκους σε λειτουργίες ορισμού.

Θα μπορούσατε να βρείτε την απάντηση σε αυτή τη σελίδα doc Python: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

Όταν η τελική τυπική παράμετρο της μορφής ** όνομα είναι παρούσα, λαμβάνει ένα λεξικό που περιέχει όλα τα επιχειρήματα λέξη-κλειδί, εκτός από εκείνες που αντιστοιχούν σε μια τυπική παράμετρο.

Έχω χοιρομητέρα περιγραφή από αυτά τα πράγματα κάπου αλλού σε python doc, αλλά δεν μπορώ να θυμόμαστε.

Απαντήθηκε 10/12/2008 στις 00:47
πηγή χρήστη

ψήφοι
1

Υπάρχουν δύο διαφορετικές υλοποιήσεις ένα για int (μακρά σε 3.0) αντικείμενα και ένα άλλο για τα αντικείμενα πλωτήρα.

Η pow πλωτήρας είναι η float_pow (PyObject * ν, PyObject * w, PyObject * z) συνάρτηση ορίζεται στην αντικείμενων / floatobject.c αρχείο του πηγαίου κώδικα Python. Αυτό λειτουργεί καλεί pow () από math.h stdlib Γ

Η pow int έχει τη δική του εφαρμογή της, είναι η int_pow συνάρτηση (PyIntObject * ν, PyIntObject * w, PyIntObject * z) ορίζεται στην Αντικείμενα / intobject.c (longobject.c για 3.0) του πηγαίου κώδικα Python.

Απαντήθηκε 10/12/2008 στις 00:32
πηγή χρήστη

ψήφοι
1

Είναι η δύναμη να χειριστή

python.org doc - χειριστή ρεύματος

Επεξεργασία: Ω, Dang, ο κώδικας, δεξιά. Ελπίζω η σύνδεση εξακολουθεί να βοηθά. Προχειρότητα ανάγνωση από την πλευρά μου

Απαντήθηκε 09/12/2008 στις 23:10
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more