2012-04-30 6 views
15

Bu benim (bir çözüm de yararlı olur gerçi) Doğrusu yardım isteği yerine, anlamaya çalışıyorum bir Python modülü karşılaşılan bir 'ilginç' olayların daha ihlal etti.dize değişmezlik

>>> import fuzzy 
>>> s = fuzzy.Soundex(4) 
>>> a = "apple" 
>>> b = a 
>>> sdx_a = s(a) 
>>> sdx_a 
'A140' 
>>> a 
'APPLE' 
>>> b 
'APPLE' 

Evet, yani fuzzy modül tamamen Python dizeleri değişmezliği ihlal eder. Bunu yapmak mümkün mü, çünkü bir C uzantısı mı? Ve bu, hem CPython'da hem de modülde ve hatta bir güvenlik riskinde bir hata oluşturuyor mu?

Ayrıca, herkes bu davranıştan kurtulmanın bir yolunu düşünebilir mi? Dizenin orijinal büyük harflerini saklamak istiyorum.

Alkış,

Alex

+0

Üretilen C içinde dizgeyi değiştirdiği hiçbir yerde göremiyorum. –

+0

@ IgnacioVazquez-Abrams: belki bir şeyleri özlüyorum, ama '__call__' ['__pyx_f_5fuzzy_7Soundex ___ call__']' da değiştirmiyor mu? PyString_AsString çağrısının sonucuna eşit olarak ayarladığı bir cdef char ptr bildirir ve sonra içeriği değiştirir. – DSM

+0

@DSM: Bitbucket'teki kodda değil. Sadece okunanları görüyorum, [891] satırında (https://bitbucket.org/yougov/fuzzy/src/c210ad2f3f68/src/fuzzy.c#cl-891). –

cevap

13

Bu hata back in February çözüldü; sürümünüzü güncelleyin.

sorunuza gelince, evet, C düzeyinde değişmez türlerinde değişiklik için çeşitli yollar vardır. Bu noktada güvenlik etkileri bilinmemektedir ve muhtemelen bilinemez.

+0

Bu cevap için teşekkürler! Aslında, üç hafta önce bulanık kurulum yapmak için easy_install kullanıyorum. Bana verdiği sürüm, fuzzy-1.0-py2.7-win-amd64.egg ve hatayı içeren bu sürüm. – Alex

+0

@Alex: Her zaman güncel kalmazlar; Bitbucket'ten yükleyin. –

2

Şu anda test etmek için kullanılabilir fuzzy modülü yok, ama şu yeni bir kimlik bir dize oluşturur:

>>> a = "hello" 
>>> b = ''.join(a) 
>>> b 
'hello' 
>>> id(a), id(b) 
(182894286096, 182894559280) 
+0

Evet, bu işe yarar :) – Alex

0

o değiştirirse immutable dize, bu bir hata, bu etrafında dolaşabilirsiniz:

s(a.upper()) 
2

Ben CPython hakkında çok şey bilmiyorum ama s__call__ giriş olduğu fuzzy.c o, char *cs = s beyan gibi görünüyor. Ardından, s[i]'u ve dolayısıyla orijinal dizgiyi değiştirecek olan cs[i]'u mutasyona uğratır. Bu kesinlikle Fuzzy ile bir hatadır ve siz onu bitbucket numaralı dosyaya yazmalısınız. Greg'in cevabı dediği gibi, ''.join(a) kullanarak yeni bir kopyasını oluşturacak.

+0

Bitbucket'de dosyalandı. İki defa. –