2010-11-20 18 views
20

मेरे पास एक कोडबेस है जो python2.x codebase में स्ट्रिंगटाइप और noneType (प्रकार मॉड्यूल) का उपयोग करता है। Python3 पर पोर्टिंग पर, परीक्षण विफल हो गए क्योंकि Python3.x में प्रकार मॉड्यूल में उपर्युक्त दो प्रकार नहीं हैं।स्ट्रिंग टाइप और कोई टाइप टाइप नहीं है python3.x

मैंने क्रमशः "str" ​​और "none" के साथ उन्हें बदलकर समस्या हल की। मैं सोच रहा था कि ऐसा करने का कोई और (सही) तरीका है या नहीं। जो मैं वर्तमान में कर रहा हूं वह निश्चित रूप से काम करता प्रतीत होता है, लेकिन मुझे संदेह है।

क्या मुझे अपने दृष्टिकोण का पालन करना चाहिए या मैंने जो किया है उसमें कुछ गड़बड़ है? यदि हां, तो मैं इसे कैसे ठीक करूं?

उत्तर

19

कोई भी जांच की जा रही आम तौर पर, obj is None बुला द्वारा किया जाता है, जबकि स्ट्रिंग के लिए जाँच आमतौर पर isinstance(obj, str) है। स्ट्रिंग और यूनिकोड दोनों का पता लगाने के लिए पायथन 2.x में, आप isinstance(obj, basestring) का उपयोग कर सकते हैं।

आप 2to3 उपयोग करते हैं, यह काफी है, लेकिन अगर आप दोनों Py2 और Py3 में काम कर कोड का एक टुकड़ा की आवश्यकता है, तो आप उस तरह कुछ के साथ खत्म हो सकता है:

try: 
    return isinstance(obj, basestring) 
except NameError: 
    return isinstance(obj, str) 
+2

आप सही हैं, लेकिन यह आम तौर पर कोड है जो '2to3 से होकर गुजरेगी बनाने के लिए अनुशंसा की जाती है सभी स्थितियों के साथ कोड कोड को बहुत से बनाने के बजाय सही ढंग से। यदि आप केवल 'आईइंस्टेंस (ओबीजे, बेसस्ट्रिंग)' का उपयोग करते हैं, तो '2to3' इसे' इंस्टेंसेंस (ओबीजे, स्ट्र) 'में बदल देगा। –

+0

आह, ठीक है, मुझे 2to3 के बारे में कोई जानकारी नहीं थी - मैंने केवल एक बार छोटी पुस्तकालय लिखी थी जिसे दोनों में काम करने की आवश्यकता थी। मैं अपना जवाब ठीक कर दूंगा। –

4

मैं जहां संभव हो सिफारिश करेंगे कि यदि आप उनके मान स्पष्ट हैं तो types में मानों से बचें; तो किसी ऑब्जेक्ट को किसी विधि को बाध्य करने जैसे कुछ के लिए, types.MethodType का उपयोग करें, लेकिन types.StringTypes(str, unicode) या basestring का उपयोग करें।

इस स्थिति के लिए, मैं इस करना होगा:

  • उपयोग obj is None या obj is not None बजाय isinstance(obj, NoneType) या not isinstance(obj, NoneType)
  • उपयोग isinstance(obj, basestring) बजाय isinstance(obj, StringTypes)
  • उपयोग isinstance(obj, str) बजाय isinstance(obj, StringType)

फिर, जब आप अजगर 3 के लिए वितरित करने के लिए की आवश्यकता होगी, कर रहे हैं, 2to3 का उपयोग करें। फिर आपका basestringstr बन जाएगा और बाकी काम करना जारी रखेंगे जैसा कि पहले हुआ था।

(साथ ही, ध्यान भालू इस विशेष रूप से StringType और StringTypes के बीच अंतर:

types.UnicodeType == unicode 
types.StringType == str 
types.StringTypes == (str, unicode) 

)

संबंधित मुद्दे