अगर चर का प्रकार स्ट्रिंग है तो कैसे जांचें?


766

क्या यह जांचने का एक तरीका है कि अजगर में एक चर का प्रकार एक है string, जैसे:

isinstance(x,int);

पूर्णांक मानों के लिए?


11
आइंस्टीन पर आवश्यक पढ़ना अगर आप अजगर canonical.org/~kragen/isinstance सीख रहे हैं ।
व्हेल


चूंकि इनटस से सावधान रहें isinstance(True, int) is True
अल्बर्ट तुगूशेव

isinstance(x,str)पायथन 3 में सही है (str एक मूल प्रकार है)।
मास्टरकंट्रोलग्राम

जवाबों:


1137

पायथन 2.x में, आप करेंगे

isinstance(s, basestring)

basestringका सार सुपरक्लास है strऔर unicode। यह परीक्षण करने के लिए एक वस्तु का एक उदाहरण है कि क्या किया जा सकता है strया unicode


पायथन 3.x में, सही परीक्षण है

isinstance(s, str)

bytesवर्ग पायथन 3 में एक स्ट्रिंग प्रकार माना जाता है।


10
@ यरिन: नहीं। लेकिन इससे कोई फर्क नहीं पड़ता, क्योंकि पायथन 3.x का मतलब पायथन 2.x के साथ बिल्कुल भी संगत नहीं है।
नेटकोडर

2
मैंने पाया कि आइन्स्टेंस (s, str) py27 के साथ काम करता है, पर परीक्षण किया गया: पायथन 2.7.5 (डिफ़ॉल्ट, अगस्त 25, 00:04:04) [GCC 4.2.1 संगत Apple LLVM 5.0 (क्लैंग -500.0.68)] डार्विन पर।
काक्यो

25
@ काकाओ: समस्या यह है कि यह unicodeवस्तुओं को याद करेगा , जिसे स्ट्रिंग्स भी माना जाना चाहिए। दोनों प्रकार strऔर प्रकार unicodeमें सामान्य आधार वर्ग है basestring, और यह वह है जिसे आप जांचना चाहते हैं।
स्वेन मार्नाच

7
@ यारिन यदि आप 2.x से 3.x तक कुछ पोर्ट कर रहे हैं, तो आप हमेशा असाइन कर सकते हैं basestring = str
जैक

9
@AdamErickson वास्तव में क्या है? यह पायथन 3 के साथ संगतता के लिए मदद नहीं करता है, क्योंकि पायथन 3 में नहीं unicodeहै। पायथन 2 और 3 के बीच संगतता के लिए मेरी सिफारिश "छह" लाइब्रेरी का उपयोग करना है। (विशेष रूप isintance(s, six.string_types)से इस मामले में)
स्वेन मार्नाच

222

मुझे पता है कि यह एक पुराना विषय है, लेकिन पहला ऐसा है जो Google पर दिखाया गया है और यह देखते हुए कि मुझे कोई भी उत्तर संतोषजनक नहीं मिलता है, मैं इसे भविष्य के संदर्भ के लिए यहां छोड़ दूंगा:

छह एक पायथन 2 और 3 संगतता पुस्तकालय है जो पहले से ही इस मुद्दे को कवर करता है। फिर आप कुछ इस तरह से कर सकते हैं:

import six

if isinstance(value, six.string_types):
    pass # It's a string !!

कोड का निरीक्षण, यह वही है जो आप पाते हैं:

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,

4
जैसे एक लाइनर के लिए: value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)जहां >=किसी भी अंतिम पायथन को मान लिया जाता है 4+ strस्ट्रिंग्स के लिए रूट क्लास रखता है ।
पाई मारिलियन

63

पायथन 3.x या पायथन 2.7.6 में

if type(x) == str:

10
मुझे "if (x) in (str, यूनिकोड):" का लालित्य पसंद है, लेकिन मैं PyLint के झंडे को "unidiomatic" के रूप में देखता हूं।
यूक्रस

15
==PEP8 द्वारा प्रकारों की तुलना करना स्पष्ट रूप से हतोत्साहित करता है, और "यूनिडायमैटिक" माने जाने वाले इसके अलावा कई डाउनसाइड्स हैं, उदाहरण के लिए, यह उपवर्गों के उदाहरणों का पता नहीं लगाता है str, जिन्हें स्ट्रिंग्स भी माना जाना चाहिए। यदि आप वास्तव में ठीक प्रकार की जांच करना चाहते हैं strऔर उपवर्गों को स्पष्ट रूप से बाहर करना चाहते हैं , तो उपयोग करें type(x) is str
स्वेन मार्नाच

17

तुम कर सकते हो:

var = 1
if type(var) == int:
   print('your variable is an integer')

या:

var2 = 'this is variable #2'
if type(var2) == str:
    print('your variable is a string')
else:
    print('your variable IS NOT a string')

उम्मीद है की यह मदद करेगा!


13

टाइप मॉड्यूल भी मौजूद है यदि आप अधिक से अधिक इन्टिंग्स और स्ट्रिंग्स की जाँच कर रहे हैं। http://docs.python.org/library/types.html


5
विशेष रूप से, types.StringTypes
मुस्तफिल

2
type.StringTypes अब पायथन 3 में मौजूद नहीं है :(
इब्राहिम

11

नीचे बेहतर उत्तर के आधार पर संपादित करें। 3 उत्तरों के बारे में नीचे जाएं और बेसस्ट्रिंग की ठंडक के बारे में पता करें।

पुराना उत्तर: यूनिकोड स्ट्रिंग्स के लिए देखें, जिसे आप विंडोज में सभी COM कॉल सहित कई स्थानों से प्राप्त कर सकते हैं।

if isinstance(target, str) or isinstance(target, unicode):

1
अच्छी पकड़। मुझे बेसरेस्ट्रिंग के बारे में पता नहीं था। यह नीचे 3 पदों के बारे में बताया गया है और एक बेहतर उत्तर की तरह लगता है।
वेड हैटलर

6
isinstance()दूसरे तर्क के रूप में एक तुक भी लेता है । तो अगर basestringमौजूद नहीं था, तो भी आप उपयोग कर सकते हैं isinstance(target, (str, unicode))
मार्टिन पीटर्स

3
अजगर 3.5.1 में, unicodeपरिभाषित नहीं दिखाई देता है:NameError: name 'unicode' is not defined
एरिक हू

11

चूंकि basestringपायथन 3 में परिभाषित नहीं किया गया है, यह छोटी चाल कोड को संगत बनाने में मदद कर सकती है:

try: # check whether python knows about 'basestring'
   basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
   basestring=str

उसके बाद आप Python2 और Python3 दोनों पर निम्न परीक्षण चला सकते हैं

isinstance(myvar, basestring)

4
या यदि आप बाइट के तार भी पकड़ना चाहते हैं:basestring = (str, bytes)
मार्क रैनसम

10

यूनिकोड सहित पायथन 2/3

from __future__ import unicode_literals
from builtins import str  #  pip install future
isinstance('asdf', str)   #  True
isinstance(u'asdf', str)  #  True

http://python-future.org/overview.html


1
आपका बहुत बहुत धन्यवाद! इंटरनेट के चारों ओर दर्जनों उत्तर हैं लेकिन एकमात्र अच्छा यही है। पहली पंक्ति अजगर 2 में डिफ़ॉल्ट रूप से बन type('foo')रही unicodeहै, और दूसरी एक strउदाहरण है unicode। Th Py Pyon 2 में कोड को वैध बनाता है और 3. फिर से धन्यवाद!
नारन

9

इसके अलावा, मैं नोटिस चाहता हूं कि यदि आप जांचना चाहते हैं कि चर का प्रकार एक विशिष्ट प्रकार है, तो आप चर के प्रकार की तुलना किसी ज्ञात वस्तु के प्रकार से कर सकते हैं।

स्ट्रिंग के लिए आप इसका उपयोग कर सकते हैं

type(s) == type('')

7
यह अजगर में जांच करने का एक भयानक, भयानक तरीका है। यदि अन्य वर्ग को विरासत में मिले तो क्या होगा str? यूनिकोड स्ट्रिंग्स के बारे में क्या, जो str2.x में से भी वारिस नहीं है ? isinstance(s, basestring)2.x में, या isinstance(s, str)3.x में उपयोग करें ।
जैक

1
@ जैक, कृपया प्रश्न पढ़ें, और यह भी ध्यान दें कि मैं नहीं लिखता कि यह सबसे अच्छा तरीका है, बस एक और तरीका है।
डेनियल ग्रैनकिन

9
यह 3 कारणों से एक बुरा विचार है: isinstance()उपवर्गों के लिए अनुमति देता है (जो कि तार भी हैं, बस विशेष), अतिरिक्त type('')कॉल निरर्थक है जब आप बस उपयोग कर सकते हैं strऔर प्रकार एकल होते हैं, इसलिए type(s) is strएक अधिक कुशल परीक्षण होने जा रहा है।
मार्टिज़न पीटरर्स

8

यहां दूसरों द्वारा दिए गए अच्छे सुझावों के बहुत सारे, लेकिन मुझे एक अच्छा क्रॉस-प्लेटफ़ॉर्म सारांश नहीं दिखता है। किसी भी पायथन कार्यक्रम के लिए एक अच्छी गिरावट होनी चाहिए:

def isstring(s):
    # if we use Python 3
    if (sys.version_info[0] >= 3):
        return isinstance(s, str)
    # we use Python 2
    return isinstance(s, basestring)

इस फ़ंक्शन में, हम यह isinstance(object, classinfo)देखने के लिए उपयोग करते हैं कि हमारा इनपुट strपायथन 3 में है या basestringपायथन 2 में।


1
यह पायथन 4 में संभावित रूप से टूट जाएगा, >=कम से कम विचार करें ।
22

2
छह.स्ट्रिंग_टाइप्स या छह.टेक्स्ट_टाइप के लिए जाँच करने के लिए क्लीनर हो
डोंब

@daonb सिर्फ एक-लाइन परीक्षण करने के लिए एक पूरे मॉड्यूल का आयात करता है, वह सोच है जो पागल निर्भरता के पेड़ और गंभीर ब्लोट को बर्बाद करने का कारण बनती है जो कुछ छोटा और सरल होना चाहिए। यह निश्चित रूप से आपकी पुकार है, लेकिन सिर्फ कहते हैं ...
duanev

@duanev यदि आप पायथन 2/3 के बारे में चिंतित हैं, तो यह किसी भी तरह से परियोजना में छह का उपयोग करने के लिए एक बेहतर विचार है। छह भी एक एकल फ़ाइल है, इसलिए निर्भरता के पेड़ / ब्लोट यहां एक मुद्दा नहीं हैं।
मोक्सीबेल

7

बेसस्ट्रिंग का उपयोग किए बिना, पायथन 2 के लिए वैकल्पिक तरीका:

isinstance(s, (str, unicode))

लेकिन फिर भी अजगर 3 में काम नहीं करेगा क्योंकि unicodeपरिभाषित नहीं है (अजगर 3 में)।


7

इसलिए,

आपके पास यह जाँचने के लिए बहुत सारे विकल्प हैं कि आपका चर स्ट्रिंग है या नहीं:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

यह आदेश उद्देश्य के लिए है।


5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

सच लौटाता है

type(a) in [str, unicode]

सच लौटाता है


पायथॉन 2.7.12 के लिए मुझे उद्धरणों को हटाना पड़ा: टाइप (ए) [str, यूनिकोड] में
एडम एरिकसन

4

इन आवश्यकताओं के साथ-साथ अजगर 2 और अजगर 3 दोनों का समर्थन करने का मेरा जवाब यहाँ है:

  • कम से कम Py2 के कम्यूटर कोड के साथ Py3 कोड में लिखा गया।
  • बाद में विघटन के बिना Py2 कम्प्रेसर कोड निकालें। यानी केवल हटाने के लिए लक्ष्य, Py3 कोड में कोई संशोधन नहीं।
  • sixकंप्‍यूटर मॉड्यूल का उपयोग करने से बचें या जैसा कि वे दूर करना चाहते हैं जो हासिल करने की कोशिश कर रहे हैं।
  • संभावित Py4 के लिए भविष्य-प्रमाण।

import sys
PY2 = sys.version_info.major == 2

# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)

# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)

# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else (str, bytes))

# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)

1

यदि आप बाहरी देयताओं पर निर्भर नहीं होना चाहते हैं, तो यह पायथन 2.7+ और पायथन 3 ( http://ideone.com/uB4Kdc ) दोनों के लिए काम करता है :

# your code goes here
s = ["test"];
#s = "test";
isString = False;

if(isinstance(s, str)):
    isString = True;
try:
    if(isinstance(s, basestring)):
        isString = True;
except NameError:
    pass;

if(isString):
    print("String");
else:
    print("Not String");

1

आप केवल यह सुनिश्चित करने के लिए आइंस्टीन फ़ंक्शन का उपयोग कर सकते हैं कि इनपुट डेटा प्रारूप स्ट्रिंग या यूनिकोड का है । नीचे दिए गए उदाहरण आपको आसानी से समझने में मदद करेंगे।

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True


-6

यह मेरा इसे करने का तरीका है:

if type(x) == type(str()):

4
type(str())कहने का एक बहुत ही गोल चक्कर रास्ता है str। प्रकार एकल हैं, इसलिए type(x) is strअधिक कुशल है। isinstance()इसके बजाय का उपयोग किया जाना चाहिए, जब तक कि आपके पास उपवर्गों की उपेक्षा करने के लिए बहुत अच्छे कारण न हों str
मार्टिन पीटर्स

if टाइप (x) str है:
शौर्य उप्पल


-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True

2
जो मामले में आप पसंद करेंगे type(thing).__name__ == 'str'से अधिक type(thing) == strया isinstance(thing, str)? unicodeपायथन के आधुनिक संस्करणों में भी मौजूद नहीं है।
तिजोरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.