2012-04-30 15 views
15

का उल्लंघन किया है यह एक पाइथन मॉड्यूल में एक 'रोचक' घटना है जिसे मैं समझने के लिए अनुरोध के बजाय समझने की कोशिश कर रहा हूं (हालांकि एक समाधान भी उपयोगी होगा)।सीपीथॉन में स्ट्रिंग अपरिवर्तनीयता ने

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

हाँ, तो fuzzy मॉड्यूल पूरी तरह से अजगर में तार की अचल स्थिति का उल्लंघन करती है। क्या यह ऐसा करने में सक्षम है क्योंकि यह सी-एक्सटेंशन है? और क्या यह सीपीथॉन के साथ-साथ मॉड्यूल, या यहां तक ​​कि एक सुरक्षा जोखिम में एक त्रुटि है?

इसके अलावा, क्या कोई इस व्यवहार को पाने के तरीके के बारे में सोच सकता है? मैं स्ट्रिंग के मूल पूंजीकरण को रखने में सक्षम होना चाहता हूं।

चीयर्स,

एलेक्स

+0

मैं उत्पन्न सी में कहीं भी नहीं देखता जहां यह स्ट्रिंग को बदलता है। –

+0

@ IgnacioVazquez-Abrams: शायद मुझे कुछ याद आ रहा है, लेकिन क्या यह इसे '__call__' ['__pyx_f_5fuzzy_7Soundex ___ call__'] में परिवर्तित नहीं करता है? यह एक cdef char ptr घोषित करता है जो इसे PyString_AsString कॉल के परिणाम के बराबर सेट करता है, और उसके बाद सामग्री को संशोधित करता है। – DSM

+0

@DSM: बिटबकेट में कोड में नहीं। मैं केवल [लाइन 891] (https://bitbucket.org/yougov/fuzzy/src/c210ad2f3f68/src/fuzzy.c#cl-891) पर इसे पढ़ता हूं। –

उत्तर

13

यह बग back in February हल किया गया था; अपना संस्करण अपडेट करें।

अपने प्रश्न का उत्तर देने के लिए, हाँ, सी स्तर पर अपरिवर्तनीय प्रकारों को संशोधित करने के कई तरीके हैं। इस बिंदु पर सुरक्षा प्रभाव अज्ञात हैं, और संभवतः यहां तक ​​कि अज्ञात भी हैं।

+0

इस उत्तर के लिए धन्यवाद! असल में, मैंने केवल तीन हफ्ते पहले अस्पष्ट स्थापित करने के लिए easy_install का उपयोग किया था। यह संस्करण मुझे दे रहा है वह फ़ज़ी-1.0-py2.7-win-amd64.egg है, और यह संस्करण है जिसमें त्रुटि है। – Alex

+0

@Alex: वे हमेशा इसे अद्यतित नहीं करते हैं; बिटबकेट से स्थापित करें। –

2

मैं fuzzy मॉड्यूल अभी परीक्षण करने के लिए उपलब्ध नहीं है, लेकिन निम्नलिखित एक नई पहचान के साथ एक स्ट्रिंग बनाता है:

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

हां, यह काम करता है :) – Alex

0

तो यह परिवर्तन अपरिवर्तनीय स्ट्रिंग, यह एक बग है, आप इसके चारों ओर घूम सकते हैं:

s(a.upper()) 
2

मुझे सीपीथॉन के बारे में बहुत कुछ पता नहीं है, लेकिन ऐसा लगता है कि fuzzy.c में यह char *cs = s घोषित करता है, जहां s__call__ पर इनपुट है। इसके बाद यह cs[i] को बदलता है, जो स्पष्ट रूप से s[i] और इसलिए मूल स्ट्रिंग को बदल देगा। यह निश्चित रूप से फ़ज़ी के साथ एक बग है और आपको इसे bitbucket पर दर्ज करना चाहिए। जैसा कि ग्रेग के जवाब ने कहा, ''.join(a) का उपयोग करके एक नई प्रतिलिपि बनाई जाएगी।

+0

यह बिटबकेट पर दायर किया गया है। दो बार। –