2016-04-14 16 views
1

Kurt W. Smith tarafından yazılan "Cython" adlı kitabı okuyorum. Bu kitap ile kafam karıştı. sayfa 42 yazar üzerindeCython: C-level int vs. PyLongObjects

söyledi: Python yerleşik int veya şamandıra gibi türleri durumlarda

C türü ile aynı ada sahip, C tipi önceliklidir. Bu neredeyse her zaman istediğimiz şey.

Ancak 44. sayfadaki yazar şunları söyledi:

Python da keyfi ölçekli tamsayıları temsil etmek C seviyesinde bir PyLongObject vardır. Python 2'de, bunlar PyIntObject taşmasıyla bir PyLongObject sonucu oluşursa, bunlar uzun tip ve olarak görünür.

Python 3'te, C düzeyinde, tüm tam sayıları PyLongObjects'dir.

Sorum Python 3 bir değişken deklare eğer, C tipi önceliklidir veya PyLongObject çünkü

cdef int a; 

bir C-düzey inta mi demek?

C seviyesi int ise, ikinci kısmı nasıl yorumlanır?

cevap

1

cdef int a Python 2 ve 3 hem de bir C-düzey tamsayı beyan; C tipi önceliklidir.

Tüm yazar int Python 3 saf her zaman PyLongObject türü anlamına geldiğini söyleyerek gibi görünüyor. Python int ve long sayısal türleri arasında artık bir ayrım yoktur.

Python 2 PyLongObject türleri anlamında long türü vardı, ama bu sadece PyLongObject türlerine başvurmak için int sahiptir Python 3'te kaldırılmıştır. Bu nedenle, Cython with Python 3 kullanırken cdef long a yazarken yerleşik türlerle olası bir çakışma yoktur.

0

bu tür sorulara basit çözüm sadece bir deneyin ve neler olacağını görmektir:

$ cat > foo.pyx 
cdef int mytestint 
mytestint = 1 
$ cython foo.pyx 
$ grep mytestint foo.c | head -n 1 
static int __pyx_v_3foo_mytestint; 
+0

Teşekkür ederiz. Bu yaklaşımı bilmek güzel. Ama bu iki paragrafın nasıl yorumlanacağını açıklar mısınız? – spacegoing