2016-04-14 26 views
2

İşlemek istediğim tek tip bir türe sahip, yıkanabilir olmayan bir python nesnesi koleksiyonu içeren bir python set var.python nesnesi işaretçi verilerine erişme

Algoritmaların verimliliğini artırmak için, veri değerleri olarak yalnızca uint64 kabul eden harici bir dizin uygulamasıyla klişeler kullanarak arabirim oluşturmak istiyorum.

Python nesnesine işaretçi başvuruları uint64 olarak bu dış kitaplığa geçirebileceğimi umuyordum?

ctypes.cast(ctypes.py_object(my_python_object), ctypes.c_uint64)'u denedim ancak ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type alıyorum.

Ayrıca, python nesnesine uint64 olarak başvuruda bulunup "gerçek" bir python nesnesine dönüştürerek tersi ne olacak?

+0

referans sayılarını artırabilmesine/azaltmasına izin vermeyecek Cidden, 'id()' kullanarak neyin yanlış olduğunu? –

+0

@AnttiHaapala Cidden hiçbir şey. :-) Sadece bunu fark etmemiştim. Bir python nesnesini 'id()' değerinden alma şansı var mıdır? Değilse, her zaman setlerimi anahtar olarak bir 'dict 'haline getirebilirim. – ARF

+0

Şey ... Nesneniz ölmüşse, onu 'id() 'den geri alamazsınız - bunun yerine sizin interperterinizi bozarsınız: D –

cevap

4

Neden CPython'da id() işlevini kullanmıyorsunuz?

>>> x 
<object object at 0x7fd2fc742090> 
>>> hex(id(x)) 
'0x7fd2fc742090' 

CPython documentation of id()

diyor

id(object)

Dönüş bir nesnenin “kimlik”. Bu, ömrü boyunca bu nesne için benzersiz ve sabit olması garantili bir tamsayıdır. Çakışmayan yaşam süreleri olan iki nesne aynı id() değerine sahip olabilir.

CPython uygulama ayrıntısı: Bu, bellekteki nesnenin adresidir.


Ayrıca referans sayıları ve böyle sen istiyorsak, "dönüştürmek" senin bu uint64_t geri bir Python nesneye ile karışıklık gerekiyor. Bildiğim kadarıyla, ctypes, bir kişinin Python

+0

Çok teşekkürler. Ama neden hex() '? – ARF

+0

Kesinlikle, bu uygulama detayı gelecekte değişebilir. – user2357112

+0

“object .__ hash__” nin çok benzer bir örneği (aslında değişti) (http://bugs.python.org/issue5186) geçmişte; Artık sadece “id (self)” i döndürmez. Örneğin, 'id' değiĢtirmeye karar verirseniz, '' object .__ hash__' ile meydana gelen aynı türden kepçe çarpıĢmalarını azaltmak için Ģu anda Ģekilde şaşırmam. – user2357112

İlgili konular