कैसे पता करें कि पायथन ऑब्जेक्ट एक स्ट्रिंग है?


402

अगर पायथन ऑब्जेक्ट एक स्ट्रिंग (या तो नियमित या यूनिकोड) है तो मैं कैसे जांच सकता हूं?


18
जेसन का क्या जिक्र है, वह है डक टाइपिंग (अगर यह बत्तख की तरह चुभता है तो शायद बत्तख ही है)। पायथन में आप अक्सर किसी भी स्ट्रिंग जैसी वस्तु पर "अपने कोड को काम करने देते हैं" चाहे वह स्ट्रिंग या स्ट्रिंग उपवर्ग हो। अधिक जानकारी के लिए, देखें: docs.python.org/glossary.html#term-duck-typing
बेन होयट

4
यही कारण है कि मैं एसओ के बारे में प्यार करता हूं। मैं आमतौर पर एक सवाल पूछता हूं, इसका जवाब नहीं है, लोग मुझे बताते हैं कि मुझे ऐसा नहीं करना चाहिए और वैसे भी, और मैं एक प्रोग्रामर के रूप में बढ़ता हूं। =)
भौतिक विज्ञान में

24
+1: सिर्फ इसलिए कि एक उत्तर की आवश्यकता शायद ही हो, इसका मतलब यह नहीं है कि प्रश्न अमान्य है। हालाँकि, मुझे लगता है कि यहाँ सावधानी बरतना बहुत अच्छा है, मुझे नहीं लगता कि यह सवाल को तोड़ मरोड़ कर पेश करता है।
ट्रेवर

17
यह संभवतः पायथन में प्रकार की जाँच का सबसे वैध उपयोग है। स्ट्रिंग्स चलने योग्य हैं, इसलिए उन्हें किसी अन्य तरीके से सूचियों से अलग करना एक बुरा विचार है।
ojrac

3
निश्चित रूप से ऐसे मामले हैं जहां अन्य पुनरावृत्तियों से तार को अलग करना आवश्यक है। उदाहरण के लिए, pprint मॉड्यूल में PrettyPrinter के लिए स्रोत कोड देखें।
saxman01

जवाबों:



178

अजगर २

यह जाँचने के लिए कि कोई वस्तु oस्ट्रिंग प्रकार के उपवर्ग का एक स्ट्रिंग प्रकार है:

isinstance(o, basestring)

क्योंकि दोनों strऔर unicodeउपवर्ग हैं basestring

यह जाँचने के लिए कि क्या प्रकार oठीक है str:

type(o) is str

यह जाँचने के लिए कि oक्या strया किसी उपवर्ग का उदाहरण है str:

isinstance(o, str)

यदि आप strसाथ बदलते हैं तो भी यूनिकोड स्ट्रिंग्स के लिए काम करता है unicode

हालाँकि, आपको स्पष्ट प्रकार की जाँच करने की आवश्यकता नहीं है। "बत्तख टाइपिंग" आपकी आवश्यकताओं के अनुरूप हो सकती है। Http://docs.python.org/glossary.html#term-duck-typing देखें ।

यह भी देखें कि अजगर में टाइप करने के लिए विहित तरीका क्या है?


स्थानीय चर 'str' असाइनमेंट से पहले संदर्भित
जॉन ktejik

@johnktejik python3 बनाम python2। आपको basestringpy2 में जांच करने की आवश्यकता है ।
erikbwork

170

अजगर ३

पायथन में 3.x basestringअब उपलब्ध नहीं है, जैसा strकि एकमात्र स्ट्रिंग प्रकार है (पायथन 2.x के शब्दार्थ के साथ unicode)।

तो पायथन 3.x में चेक सिर्फ है:

isinstance(obj_to_test, str)

यह आधिकारिक रूपांतरण टूल के फिक्स का अनुसरण 2to3करता है: परिवर्तित basestringकरना str


94

अजगर 2 और 3

(क्रॉस-संगत)

यदि आप पायथन संस्करण (2.x बनाम 3.x) के लिए कोई संबंध नहीं देखना चाहते हैं, तो इसका उपयोग करें six( PyPI ) और इसकी string_typesविशेषता:

import six

if isinstance(obj, six.string_types):
    print('obj is a string!')

भीतर six(एक बहुत हल्के वजन एकल फ़ाइल मॉड्यूल), यह बस कर रहा है यह :

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str
else:
    string_types = basestring

वैकल्पिक रूप से, आप नाम रखने के लिए भी future( PyPI ) का उपयोग कर सकते हैं :from past.builtins import basestring
David Nemeskey

1
BTW द चीट शीट पाइथन संस्करण की अनुकूलता के लिए एक बेहतरीन संसाधन है।
डेविड नेमेस्की

1
किसी भी आयात का उपयोग नहीं करने के बारे में क्या? पहले कोशिश करो basestringऔर फिर वापस गिरो str। जैसेdef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
isaacbernat

19

मुझे यह ans अधिक मिला pythonic:

if type(aObject) is str:
    #do your stuff here
    pass

चूंकि टाइप ऑब्जेक्ट्स सिंगलटन हैं, इसलिए इसका उपयोग स्ट्रैस प्रकार के ऑब्जेक्ट की तुलना करने के लिए किया जा सकता है


4
यह प्रकार के लिए परीक्षण का सामान्य अनुशंसित तरीका नहीं है, क्योंकि वंशानुक्रम: isinstance(obj_to_test, str)स्पष्ट रूप से टाइप के लिए परीक्षण करने के लिए है, और इसका अन्य, नॉन-स्ट्रेट मामलों के समान प्रक्रिया का उपयोग करने का लाभ है।
एरिक ओ लेबिगॉट

14

यदि कोई स्पष्ट प्रकार की जाँच से दूर रहना चाहता है (और इससे दूर रहने के अच्छे कारण हैं ), तो शायद जाँच करने के लिए स्ट्रिंग प्रोटोकॉल का सबसे सुरक्षित हिस्सा है:

str(maybe_string) == maybe_string

यह है, यह एक सूची के-तार एक स्ट्रिंग फोन करेगा पुनरावृति एक iterable या iterator के माध्यम से नहीं होगा नहीं और इसे सही ढंग एक का पता लगाता है stringlike स्ट्रिंग के रूप।

बेशक कमियां हैं। उदाहरण के लिए, str(maybe_string)एक भारी गणना हो सकती है। जैसा कि अक्सर, उत्तर यह निर्भर करता है

संपादित करें: जैसा कि @Tcll बताते टिप्पणी में, सवाल वास्तव में दोनों यूनिकोड तार और bytestrings का पता लगाने के लिए एक रास्ता के लिए पूछता है। पायथन 2 पर यह उत्तर यूनिकोड स्ट्रिंग्स के लिए एक अपवाद के साथ विफल हो जाएगा जिसमें गैर-एएससीआईआई अक्षर होते हैं, और पायथन 3 पर यह Falseसभी बाइटस्ट्रेस के लिए वापस आ जाएगा ।


प्रतिनिधित्व डेटा के साथ आरंभ करने वाली वस्तुओं के मामले में, यह उम्मीद के मुताबिक काम नहीं कर सकता है ... b = b'test'; r = str(b) == bजहां bएक ही डेटा रखता है str(b)लेकिन (बाइट ऑब्जेक्ट होने के नाते) एक स्ट्रिंग के रूप में मान्य नहीं है।
टीसीएल

@ Tcll राइट, प्रश्न वास्तव में "या तो नियमित या यूनिकोड" कहता है। मुझे लगता है कि मैंने इसे ठीक से नहीं पढ़ा।
क्लैके

11

यह जाँचने के लिए कि क्या आपका चर वह है जिसे आप पसंद कर सकते हैं:

s='Hello World'
if isinstance(s,str):
#do something here,

आइसिस्टेंस का आउटपुट आपको एक बूलियन ट्रू या फाल्स वैल्यू देगा ताकि आप उसके अनुसार एडजस्ट कर सकें। आप शुरू में उपयोग करके अपने मूल्य के अनुमानित अनुमान की जांच कर सकते हैं: प्रकार (ओं) यह आपको 'str' टाइप करेगा, ताकि आप इसे आइस्टेंस फ़ंक्शन में उपयोग कर सकें।


5

मैं इसका उल्लेख बतख-टाइपिंग शैली में कर सकता हूं, जैसा कि अन्य लोग करते हैं। मुझे कैसे पता चलेगा कि एक स्ट्रिंग वास्तव में एक स्ट्रिंग है? अच्छी तरह से, जाहिर है यह एक स्ट्रिंग में परिवर्तित करके !

def myfunc(word):
    word = unicode(word)
    ...

यदि आर्ग पहले से ही एक स्ट्रिंग या यूनिकोड प्रकार है, तो real_word इसका मान अनमॉडिफाइड रखेगा। यदि ऑब्जेक्ट एक __unicode__विधि को लागू करता है, तो इसका यूनिकोड प्रतिनिधित्व प्राप्त करने के लिए उपयोग किया जाता है। यदि पास की गई वस्तु को स्ट्रिंग के रूप में उपयोग नहीं किया जा सकता है, तो unicodeअंतर्निहित अपवाद को उठाता है।


3
isinstance(your_object, basestring)

सच होगा यदि आपकी वस्तु वास्तव में एक स्ट्रिंग-प्रकार है। 'str' आरक्षित शब्द है।

मेरी क्षमा याचना, सही उत्तर में यूनिकोड स्ट्रिंग्स को शामिल करने के लिए 'स्ट्रैस' के बजाय 'बेसिस्ट्रिंग' का उपयोग किया जा रहा है - साथ ही अन्य उत्तरदाताओं में से एक द्वारा ऊपर उल्लेख किया गया है।


यूनिकोड ऑब्जेक्ट्स के लिए काम नहीं करता है, जो प्रश्न में स्पष्ट रूप से अनुरोध किया गया था।
dbn

1

आज शाम मैं एक ऐसी स्थिति में भाग गया, जिसमें मुझे लगा कि मुझे strटाइप के खिलाफ जांच करनी है , लेकिन यह पता चला कि मैं नहीं था।

समस्या को हल करने के लिए मेरा दृष्टिकोण शायद कई स्थितियों में काम करेगा, इसलिए मैं इसे नीचे की पेशकश करता हूं यदि अन्य लोग इस प्रश्न को पढ़ रहे हैं (पायथन 3)।

# NOTE: fields is an object that COULD be any number of things, including:
# - a single string-like object
# - a string-like object that needs to be converted to a sequence of 
# string-like objects at some separator, sep
# - a sequence of string-like objects
def getfields(*fields, sep=' ', validator=lambda f: True):
    '''Take a field sequence definition and yield from a validated
     field sequence. Accepts a string, a string with separators, 
     or a sequence of strings'''
    if fields:
        try:
            # single unpack in the case of a single argument
            fieldseq, = fields
            try:
                # convert to string sequence if string
                fieldseq = fieldseq.split(sep)
            except AttributeError:
                # not a string; assume other iterable
                pass
        except ValueError:
            # not a single argument and not a string
            fieldseq = fields
        invalid_fields = [field for field in fieldseq if not validator(field)]
        if invalid_fields:
            raise ValueError('One or more field names is invalid:\n'
                             '{!r}'.format(invalid_fields))
    else:
        raise ValueError('No fields were provided')
    try:
        yield from fieldseq
    except TypeError as e:
        raise ValueError('Single field argument must be a string'
                         'or an interable') from e

कुछ परीक्षण:

from . import getfields

def test_getfields_novalidation():
    result = ['a', 'b']
    assert list(getfields('a b')) == result
    assert list(getfields('a,b', sep=',')) == result
    assert list(getfields('a', 'b')) == result
    assert list(getfields(['a', 'b'])) == result

1

इसका सरल, निम्न कोड का उपयोग करें (हम मान लें कि उल्लिखित वस्तु)

if type(obj) == str:
    print('It is a string')
else:
    print('It is not a string.')

0

आप खाली स्ट्रिंग के साथ इसका परीक्षण कर सकते हैं:

def is_string(s):
  try:
    s += ''
  except:
    return False
  return True

संपादित करें :

टिप्पणियों के बाद मेरे उत्तर को सही बताते हुए कि यह सूचियों के साथ विफल रहता है

def is_string(s):
  return isinstance(s, basestring)

आप सही हैं, इशारा करने के लिए धन्यवाद। मैंने एक वैकल्पिक उत्तर दिया है।
जार्जपार्किसिस

-3

स्ट्रिंग-पसंद के लिए एक अच्छा बतख-टाइपिंग दृष्टिकोण के लिए जो पायथन 2.x और 3.x दोनों के साथ काम करने का बोनस है:

def is_string(obj):
    try:
        obj + ''
        return True
    except TypeError:
        return False

वारफिश डक-टाइपिंग के करीब था इससे पहले कि वह isinstanceदृष्टिकोण पर स्विच करता है, सिवाय इसके कि +=सूचियों के लिए अलग अर्थ +है।


2
खैर, आपके पास दो डाउनवोट हैं और किसी ने भी एक टिप्पणी नहीं दी है। मैंने नीचा नहीं देखा है, लेकिन मुझे आपका समाधान पसंद नहीं है क्योंकि: * बहुत क्रिया। आपको ऐसा करने के लिए फ़ंक्शन को परिभाषित करने की आवश्यकता नहीं है। * महँगा। प्रदर्शन के लिए अपवादों को पकड़ना अच्छा नहीं है। * प्रवण त्रुटि। अन्य ऑब्जेक्ट ऐड को लागू कर सकते हैं , एक स्ट्रिंग देख सकते हैं, और दूसरे प्रकार के अपवाद को बढ़ा सकते हैं, जो टाइपऑयर नहीं है।
संततिगोबसुल्तो

इसके अलावा यहाँ आप बतख-टाइपिंग दृष्टिकोण को नियोजित कर रहे हैं, जो सुंदर है, लेकिन केवल कुछ पता लगाने के लिए अपवाद को फेंकने और पकड़ने के साथ समाप्त होता है, जो सुंदर नहीं है।
एलेक्सी तिगारेव

यह वैध रूप से एक स्ट्रिंग-जैसे और कुछ अन्य स्ट्रिंग के बीच अंतर करने का एकमात्र अचूक तरीका हो सकता है। एक जैसे गुणों की तलाश कर सकता है isalpha, लेकिन कौन जानता है कि किन तरीकों की तलाश करना सुरक्षित होगा?
क्लैक

मैंने महसूस किया कि __str__विधि प्लस समानता वास्तव में मूर्खतापूर्ण साबित हो सकती है। लेकिन यह भी कि बिना caveats के नहीं है।
क्लैक

पाइथन में @santiagobasulto अपवाद सस्ते हैं। यदि आप त्रुटि का 1% समय की उम्मीद करते हैं, tryतो तेज हो सकता है। यदि आप इसे 99% समय की उम्मीद करते हैं, तो शायद नहीं। प्रदर्शन अंतर न्यूनतम होना, मुहावरेदार होना बेहतर है जब तक आप अपने कोड को प्रोफाइल नहीं करते हैं और इसे वास्तव में धीमा होने की पहचान करते हैं।
निक टी

-4
if type(varA) == str or type(varB) == str:
    print 'string involved'

EDX से - ऑनलाइन पाठ्यक्रम MITx: 6.00.1x कंप्यूटर विज्ञान का परिचय और पायथन का उपयोग करके प्रोग्रामिंग


6
यह जांच करने का संभवत: सबसे खराब तरीका है। न केवल यह यूनिकोड वस्तुओं को बाहर करता है, बल्कि यह उपवर्गों को भी शामिल नहीं करता है str!
अगुरार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.