2011-05-31 24 views
6

Verileri sürekli olarak tüm diğer kullanıcılara göndermesi gereken çok noktaya yayın ağım var. Bu veriler sürekli olarak değişecektir, bu yüzden programcının kullanıcılara paket göndermeyle uğraşmasını istemiyorum. Bu nedenle, Python'da (Python'da yeniyim) herhangi bir nesneyi veya değişkeni nasıl referans gösterebileceğimi bulmaya çalışıyorum, böylece kullanıcı tarafından değiştirilebilir ve çok noktaya yayın paketlerinde ne gönderileceğini değiştirir. Düzeltebilirim nasıl bir Yardım çok takdirPython'daki başvurular

>>> test = "test" 
>>> mdc = MulticastDataClient() 
>>> mdc.add(test) # added into an internal list that is sent to all users 

# here we can see that we are successfully receiving the data 
>>> print mdc.receive() 
{'192.168.1.10_0': 'test'} 

# now we try to change the value of test 
>>> test = "this should change" 
>>> print mdc.receive() 
{'192.168.1.10_0': 'test'} # want 'test' to change to -> 'this should change' 

: Burada

ne istiyorum bir örnektir. Ben de bu şekilde çalıştık

:

GÜNCELLEME

>>> test = [1, "test"] 
>>> mdc = MulticastDataClient() 
>>> mdc.add(test) 
>>> mdc.receive() 
{'192.168.1.10_1': 'test'} 
>>> test[1] = "change!" 
>>> mdc.receive() 
{'192.168.1.10_1': 'change!'} 

Bu çalışma yaptı. Ancak ,

>>> val = "ftw!" 
>>> nextTest = [4, val] 
>>> mdc.add(nextTest) 
>>> mdc.receive() 
{'192.168.1.10_1': 'change!', '192.168.1.10_4': 'ftw!'} 
>>> val = "different." 
>>> mdc.receive() 
{'192.168.1.10_1': 'change!', '192.168.1.10_4': 'ftw!'} 

Bu işe yaramaz. 'Ftw'ye ihtiyacım var!' 'farklı olmak'. bu durumda. Test için dizeleri kullanıyorum ve diğer dillerden nesneler olan dizeleri kullanıyorum. Sadece bir nesnenin içindeki içeriği düzenleyeceğim, bu da işe yarayacak mı?

+0

Ne demek istiyorsun "Sadece düzenleme yapacağım bir nesnenin içindeki içerik "? –

+0

@rshallit Eğer "pos" olarak adlandırılan bir konum nesnesi olsaydık, sadece pos.x ve pos.y dizinlerini kullanırdım, "pos" kelimesinin bellekte konumunu değiştirmesinden endişelenmenize gerek kalmazdı. Sanırım bunu yayınlamam gereksizti. –

cevap

5

Python'da her şey bir referanstır, ancak dizeler değiştirilemez. Yani test "test" için bir referans tutuyor. Eğer "bu değişmeli" değerini test'a atarsanız, onu başka bir referansa değiştirin. Ancak müşterileriniz hala "test" referansına sahip. Veya daha kısa: Python'da bu şekilde çalışmıyor! ;-)

bir çözüm, bir nesnenin içine veri koymak olabilir:

data = {'someKey':"test"} 
mdc.add(data) 

Şimdi müşterileriniz sözlüğe bir başvuru tutun. Bu sözlüğü güncelleştirirseniz, istemcileriniz değişiklikleri görür:

data['someKey'] = "this should change" 
+0

Bunun istediğini yapacağıma emin misin? MulticastDataClient (gerçek bir sınıf/kitaplıksa) ile aşina değilim, ancak en azından, ben – Foon

+0

değiştirdikten sonra paketi yeniden göndermek için zorlamak için bir şey yapmanız gerektiğini varsayalım Verilerin işlem sınırları boyunca gittiğini varsayalım . Bu durumda haklısınız, ama bana göre asıl posterin bunun farkında olduğunu ima eder. Python referanslarının kutudan sokulan prizlerle çalışmadığının çok açık olduğunu düşünüyorum. – Achim

+0

@Foon MulticastDataClient, oluşturduğum bir şeydir. Yerel kullanıcının "sahibi" olduğu ve çok noktaya yayın yaptığı verileri göndermeyi amaçlamaktadır. Her türlü verinin, devralınan MulticastDataClient nesneleri kullanılarak gönderilmesi gerekir. Dolayısıyla bir nesne gps konumlarını ele alabilir, diğeri kullanıcı bilgilerini ele alabilir, vb. Şu anda, sadece test etmek için dizeleri kullanıyorum. @Achim'in bu soruyu sormadan önce neyin yukarıda belirttiğine dair bir uygulama kullandım ve bu soruya karşı neler yaptığımı göstermek için sorumu düzenledim. Beni bu yönde tekrar hatırladığın için @Achim'e teşekkür ederim. –

3

Kolayca yapamazsınız. Python'da bir isim (değişken) sadece bir işaretçi için bir konumdur. Üzerine yaz ve sadece işaretçiyi başka bir işaretçi ile değiştir, yani değişiklik sadece aynı değişkeni kullanan kişiler tarafından görülebilir. Nesne üyeleri temelde aynıdır, ancak durumları onlara işaretçi olan herkes tarafından görüldüğü için, bu gibi değişiklikler yapabilirsiniz. Her zaman için obj.varher zaman kullanmanız gerekir. Elbette, dizeler (tamsayılar, tupller, birkaç başka yerleşik tip ve birkaç başka türle birlikte) değişmezdir, yani başkalarının değiştiremeyeceği bir şeyi değiştiremezsiniz.

Ancak nesnelerin mutability başka olasılık açar: Sen olabilir, sen onu içine çekmeye bir abritary nesne içeren bir sarmalayıcı sınıf yazmak için rahatsız eğer önemli bir set() yöntemi ve delegeler her şey olsa o nesneyi değiştirerek verir bu nesne Gerçi er ya da geç kötü ahlaksal sıkıntılarla karşılaşırsın. Mesela, bu, tüm üyelerin içinden geçen metaprogramlama ile ya da uğraşmak zorunda olduğunu düşündüğü herhangi bir şeyle iyi oynayabileceğini düşünemiyorum. Ayrıca inanılmaz derecede hacky (yani güvenilmez). Muhtemelen daha kolay bir çözüm var.

(Bir yan notta, PyPy, bir nesneye gerçekten başvurup, bir nesneyi başka bir nesne ile değiştiren, bu nesneye başvuruda bulunan herkes tarafından görülebilen, varsayılan olmayan nesne boşluklarından birinde become işlevine sahiptir. Diğer tüm uygulamalar olsa da ve inanılmaz potansiyeli ve yanlış kullanım karışıklığını ve çoğumuzun nadiren bu konuya ihtiyaç duyduğu gerçeğini gerçek kodda neredeyse kabul edilemez hale getirdiğini düşünüyorum.)

İlgili konular