यह कैसे जांचा जाए कि चर 2 और 3 संगतता के साथ स्ट्रिंग है


171

मुझे पता है कि मैं उपयोग कर सकता हूं: isinstance(x, str)अजगर -३ एक्स में लेकिन मुझे यह जांचने की आवश्यकता है कि क्या चीज अजगर २.x में भी एक स्ट्रिंग है। विल isinstance(x, str)अजगर-2.x में अपेक्षा के अनुरूप काम? या मुझे संस्करण की जांच करने और उपयोग करने की आवश्यकता होगी isinstance(x, basestr)?

विशेष रूप से, अजगर -२ x में:

>>>isinstance(u"test", str)
False

और अजगर 3.x के पास नहीं है u"foo"


2
यू "" यूनिकोड शाब्दिक वाक्य विन्यास अजगर 3.3 में पुनः शुरू किया है
JFS

अजीब। मैं यह सच है `` `पायथन 2.7.16 पर` `` मिल >>> isinstance (यू "परीक्षण", basestring)
Darakian

जवाबों:


209

यदि आप 2.x-and-3.x- संगत कोड लिख रहे हैं, तो आप संभवतः छह का उपयोग करना चाहेंगे :

from six import string_types
isinstance(s, string_types)

क्षमा करें, मैं निम्नलिखित परिणाम के बारे में थोड़ा भ्रमित हूं। >>> isinstance(u"foo", string_types) True >>> isinstance(u"foo".encode("utf-8"), string_types) True मुझे उम्मीद थी कि आइंस्टीन (u "foo", string_types) झूठे लौटेंगे।
Chandler.Huang

1
@ चांडलर.हुआंग यह सवाल पहचानने strऔर unicodeपायथन 2 पर, या strपायथन 3 पर है। यदि आप unicodeअजगर 2 पर भरोसा नहीं करना चाहते हैं , तो उपयोग करें str
इकतुर

@ecatmur वाह, धन्यवाद! इसे हटा दिया गया है, इसलिए कोई भ्रमित नहीं होता है
रनड्रोसन

4
आप इसे futureपैकेज के स्थान पर भी इस्तेमाल कर सकते हैं six:from future.utils import string_types
सुपर जियो

113

छह की तरह पैकेजों पर भरोसा किए बिना मैंने जो सबसे ट्रिक दृष्टिकोण पाया है, वह है:

try:
  basestring
except NameError:
  basestring = str

फिर, यह मानकर कि आप पायथन 2 में सबसे सामान्य तरीके से तार की जाँच कर रहे हैं,

isinstance(s, basestring)

अब पायथन 3+ के लिए भी काम करेगा।


10
पी 3 के लिए, basestring = (str, bytes)सेrequests/compat.py
वू

अच्छा लगा, लेकिन क्यों? यह अच्छा होगा यदि पायथन 3 यहां पिछड़ा-संगत होगा। उपरोक्त समाधान काम करता है। बेहतर होगा, अगर इसके लिए कोई आवश्यकता नहीं होगी।
गुफ्तगू

2
दोनों py2 और 3 समर्थन और mypy संतुष्ट करने के लिए, मैं के साथ समाप्त हुआif not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
डेव ली

35

इसके बारे में क्या, सभी मामलों में काम करता है?

isinstance(x, ("".__class__, u"".__class__))

@holdenweb: नहीं और हां - एक निफ्टी "केवल वही प्रभाव डालता है जहां जरूरत" हैक मुझे लगता है।
Dilettant

1
मुझे यह उत्तर पसंद है, इसका कारण यह है कि यह
python2

4
मैं भी इस विकल्प के साथ गया था, इसे एक सहायक फ़ंक्शन में लपेटकर, इसलिए यह केवल एक बार दिखाई देता है, और डॉकस्ट्रिंग में क्रेडिट फिल में एक जगह है।
कार्ल स्मिथ

2
नीट, और मैं इसे स्वयं उपयोग कर रहा था, जब तक मुझे एहसास नहीं हुआ कि मैं भी from __future__ import unicode_literalsसक्रिय हूं । अब मैं साथ जा रहा हूँ:isinstance(val, (str, u"".__class__))
ग्राहम क्लीं

18

यह @ लेव लेवस्की का जवाब है, थोड़ा फिर से लिखा गया है।

try:
    isinstance("", basestring)
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

try/ exceptपरीक्षण एक बार किया जाता है, और फिर एक समारोह है कि हमेशा काम करता है और संभव के रूप में तेजी से होता है परिभाषित करता है।

संपादित करें: वास्तव में, हमें कॉल करने की आवश्यकता नहीं है isinstance(); हमें बस मूल्यांकन करने basestringऔर देखने की आवश्यकता है कि क्या हमें एक NameError:

try:
    basestring  # attempt to evaluate basestring
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

मुझे लगता है कि कॉल के साथ चलना आसान है isinstance(), हालांकि।


isinstance("", basestring)"कॉलिंग" से मेरा मतलब है। वैसे भी, +1।
लेव लेवित्स्की

1
पायथन एक बहुत ही गतिशील भाषा है, और मुझे नहीं लगता है कि इस तरह एक परीक्षण करना बिल्कुल बुरा लगता है। यह एक समय में किसी चीज़ का पता लगाने के लिए एक उपयोगी तकनीक है, और उसके आधार पर, एक फ़ंक्शन सेट करना जो हमेशा सही होगा। +1 के लिए धन्यवाद।
स्टेव जूल

5
मैं इसे try: string_types = basestring except NameError: string_types = str
निम्नानुसार लिखूंगा

12

futureपुस्तकालय (अजगर 2 के लिए) कहते हैं संगत के नाम है, तो आप कर सकते हैं लिखने के अजगर 3 जारी रखने के लिए । आप निम्न कार्य सरल कर सकते हैं:

from builtins import str
isinstance(x, str) 

इसे स्थापित करने के लिए , बस निष्पादित करें pip install future

एक चेतावनी के रूप में , यह केवल समर्थन करता है python>=2.6, >=3.3लेकिन यह तुलना में अधिक आधुनिक है six, जिसका उपयोग करने पर केवल सिफारिश की जाती हैpython 2.5


8

शायद जैसे एक समाधान का उपयोग करें

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)

क्षमा करें आप बग के लिए, लेकिन विंडो 7 के तहत पायथन 3.2.3 के साथ मेरे लिए isinstance(u'hello', basestr)पैदावार SyntaxError: invalid syntax.. किसी भी विचार क्यों यह होगा? ऐसा लगता है कि नहीं लगता है u- मैं के साथ इस त्रुटि मिलती है strऔरbasestr
लेवोन

1
@Levon कोई समस्या नहीं है :) ऐसा इसलिए है क्योंकि Python3 में सिंटेक्स नहीं है , जैसा strकि Python3 में यूनिकोड परिभाषा के अनुसार है। तदनुसार, कोई basestringप्रकार नहीं है , इसलिए यह NameErrorमेरे स्निपेट में पकड़ा गया है।
लेव लेवित्स्की

यह एक वाक्यविन्यास के रूप में अब एक noop है। 3.3 में
रान्डेल हंट

2
मैं एक बार में try/ exceptपरीक्षण करने का सुझाव दूंगा , और उस एकल परीक्षण के परिणामों के आधार पर, आप isstr()सही तरीके से परिभाषित करते हैं । हर कॉल के लिए एक अपवाद के ओवरहेड को उकसाने की आवश्यकता नहीं है isstr()
स्टीवेहा जूल

@ रमन Python 3.3 के बारे में सही है, यहाँ PEP के लिए एक लिंक है ।
लेव लेविस्की

7

आप कॉल करके किसी ऑब्जेक्ट का वर्ग प्राप्त कर सकते हैं object.__class__, इसलिए यह जांचने के लिए कि ऑब्जेक्ट डिफ़ॉल्ट स्ट्रिंग प्रकार है:

    isinstance(object,"".__class__)

और आप निम्नलिखित को अपने कोड के शीर्ष पर रख सकते हैं ताकि उद्धरणों द्वारा संलग्न तार अजगर 2 में यूनिकोड में हों:

    from __future__ import unicode_literals

मैं इस समाधान काफी एक सा। मैंने पाया कि यह str = "" .__ वर्ग__ को परिभाषित करने के लिए उपयोगी हो सकता है, जो अब आइंस्टीन (ऑब्जेक्ट, str) को सामान्य रूप से लिखने की अनुमति देता है, और यह भी सुनिश्चित करता है कि str (ऑब्जेक्ट) Python 2 और Pyreon 3 दोनों में एक यूनिकोड स्ट्रिंग लौटाएगा।
amicitas

XML को पार्स करते समय यह काम नहीं करता है: some_element.textएक 'str' है, लेकिन 'यूनिकोड' के साथ तुलना विफल हो जाएगी
वॉल्ट

पर अजगर 2 यूनिकोड तार के साथ शामिल नहीं है काम: isinstance (u'XXX ',' '.__ class__) == झूठी
Fil

0

आप अपने कोड की शुरुआत में यह कोशिश कर सकते हैं:

from __future__ import print_function
import sys
if sys.version[0] == "2":
    py3 = False
else:
    py3 = True
if py3: 
    basstring = str
else:
    basstring = basestring

और बाद में कोड में:

anystring = "test"
# anystring = 1
if isinstance(anystring, basstring):
    print("This is a string")
else:
    print("No string")

0

सावधान रहे! अजगर 2 में, strऔर bytesअनिवार्य रूप से समान हैं। यह एक बग पैदा कर सकता है यदि आप दोनों के बीच अंतर करने की कोशिश कर रहे हैं।

>>> size = 5    
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True

-4

type (string) == str

सच है अगर इसकी एक स्ट्रिंग, और गलत है अगर नहीं


1
पायथन 2 के लिए सही नहीं है, जहां stringएक यूनिकोड स्ट्रिंग है
lxop
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.