2008-12-09 28 views
11

Operatörün ** Python'da nasıl uygulandığını göstermek için kaynağı nerede bulacağımı merak ediyorum. Birisi bana doğru yönde işaret edebilir mi?** Python'da nasıl uygulanır?

cevap

24

(ayrıştırıcı pgen kullanılarak üretilen edildiği) piton dilbilgisi tanımı, 'güç' için bak: 'ast_for_power' arayın Gramar/Gramar

piton ast: Python/ast.c

piton Eval döngü, Python/ceval.c

PyNumber_Power çağırır (Objects/abstract.c uygulanan):

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

Esasen, pow yuvasını çağırın. Uzun nesneler (3.0 tek varsayılan tamsayı türü) için bu, sen long_pow içine kazmak Eğer int_pow fonksiyonu Object/intobject.c

uygulanan (2.x dallarında) int nesneler için, long_pow fonksiyonu Objects/longobject.c uygulanan keyfi hassasiyet için verimli üs alma algoritmaları açıklanır Handbook of Applied Cryptography arasında Chapter 14.6 tartışılan algoritmalar kullanır

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

: Eğer argümanları inceleme ve kurmak biraz yaptıktan sonra, üs kalbi burada göremiyor olabilir görebilirsiniz aritmetik.

1

Biri int (3.0'da uzun) nesneler ve bir kayan nesneler için bir tane olmak üzere iki farklı uygulama vardır.

Float pow, Python kaynak kodunun Objects/floatobject.c dosyasında tanımlanan float_pow (PyObject * v, PyObject * w, PyObject * z) işlevidir. Bu işlev, Ctrllib'in math.h

'dan gelen çağrıları çağırır. Int pow'in kendi uygulaması vardır, Objects/intobject.c'de tanımlanan int_pow (PyIntObject * v, PyIntObject * w, PyIntObject * z) işlevidir (longobject). Python kaynak kodunun 3.0.

1

Sanırım caseysrandomthoughts, fonksiyon tanımında yıldız işaretleri soruyor.

Bu Python doc sayfasından cevap bulabiliriz: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

formun nihai biçimsel parametre ** isim, resmi bir parametreye karşılık gelen dışındaki tüm anahtar kelime argümanları içeren bir sözlük mevcut görevlileri tarafından yapılıyor.

Bu şeyin python belgesinde başka bir yerde tarifini açıklıyorum ama hatırlayamıyorum.

+0

Fonksiyon çağrısına/tanımına atıfta bulunulduğunda, ** bir operatör değil, çağrı/tanım sözdiziminin bir parçasıdır (http://docs.python.org/3.0/reference/expressions.html#id7, http: // docs.python.org/3.0/reference/compound_stmts.html#function-definitions) –