अगर पायथन ऑब्जेक्ट एक स्ट्रिंग (या तो नियमित या यूनिकोड) है तो मैं कैसे जांच सकता हूं?
अगर पायथन ऑब्जेक्ट एक स्ट्रिंग (या तो नियमित या यूनिकोड) है तो मैं कैसे जांच सकता हूं?
जवाबों:
यह जाँचने के लिए कि कोई वस्तु 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 देखें ।
यह भी देखें कि अजगर में टाइप करने के लिए विहित तरीका क्या है?
basestring
py2 में जांच करने की आवश्यकता है ।
पायथन में 3.x basestring
अब उपलब्ध नहीं है, जैसा str
कि एकमात्र स्ट्रिंग प्रकार है (पायथन 2.x के शब्दार्थ के साथ unicode
)।
तो पायथन 3.x में चेक सिर्फ है:
isinstance(obj_to_test, str)
यह आधिकारिक रूपांतरण टूल के फिक्स का अनुसरण 2to3
करता है: परिवर्तित basestring
करना str
।
यदि आप पायथन संस्करण (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
basestring
और फिर वापस गिरो str
। जैसेdef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
मुझे यह ans अधिक मिला pythonic
:
if type(aObject) is str:
#do your stuff here
pass
चूंकि टाइप ऑब्जेक्ट्स सिंगलटन हैं, इसलिए इसका उपयोग स्ट्रैस प्रकार के ऑब्जेक्ट की तुलना करने के लिए किया जा सकता है
isinstance(obj_to_test, str)
स्पष्ट रूप से टाइप के लिए परीक्षण करने के लिए है, और इसका अन्य, नॉन-स्ट्रेट मामलों के समान प्रक्रिया का उपयोग करने का लाभ है।
यदि कोई स्पष्ट प्रकार की जाँच से दूर रहना चाहता है (और इससे दूर रहने के अच्छे कारण हैं ), तो शायद जाँच करने के लिए स्ट्रिंग प्रोटोकॉल का सबसे सुरक्षित हिस्सा है:
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)
लेकिन (बाइट ऑब्जेक्ट होने के नाते) एक स्ट्रिंग के रूप में मान्य नहीं है।
यह जाँचने के लिए कि क्या आपका चर वह है जिसे आप पसंद कर सकते हैं:
s='Hello World'
if isinstance(s,str):
#do something here,
आइसिस्टेंस का आउटपुट आपको एक बूलियन ट्रू या फाल्स वैल्यू देगा ताकि आप उसके अनुसार एडजस्ट कर सकें। आप शुरू में उपयोग करके अपने मूल्य के अनुमानित अनुमान की जांच कर सकते हैं: प्रकार (ओं) यह आपको 'str' टाइप करेगा, ताकि आप इसे आइस्टेंस फ़ंक्शन में उपयोग कर सकें।
मैं इसका उल्लेख बतख-टाइपिंग शैली में कर सकता हूं, जैसा कि अन्य लोग करते हैं। मुझे कैसे पता चलेगा कि एक स्ट्रिंग वास्तव में एक स्ट्रिंग है? अच्छी तरह से, जाहिर है यह एक स्ट्रिंग में परिवर्तित करके !
def myfunc(word):
word = unicode(word)
...
यदि आर्ग पहले से ही एक स्ट्रिंग या यूनिकोड प्रकार है, तो real_word इसका मान अनमॉडिफाइड रखेगा। यदि ऑब्जेक्ट एक __unicode__
विधि को लागू करता है, तो इसका यूनिकोड प्रतिनिधित्व प्राप्त करने के लिए उपयोग किया जाता है। यदि पास की गई वस्तु को स्ट्रिंग के रूप में उपयोग नहीं किया जा सकता है, तो unicode
अंतर्निहित अपवाद को उठाता है।
isinstance(your_object, basestring)
सच होगा यदि आपकी वस्तु वास्तव में एक स्ट्रिंग-प्रकार है। 'str' आरक्षित शब्द है।
मेरी क्षमा याचना, सही उत्तर में यूनिकोड स्ट्रिंग्स को शामिल करने के लिए 'स्ट्रैस' के बजाय 'बेसिस्ट्रिंग' का उपयोग किया जा रहा है - साथ ही अन्य उत्तरदाताओं में से एक द्वारा ऊपर उल्लेख किया गया है।
आज शाम मैं एक ऐसी स्थिति में भाग गया, जिसमें मुझे लगा कि मुझे 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
इसका सरल, निम्न कोड का उपयोग करें (हम मान लें कि उल्लिखित वस्तु)
if type(obj) == str:
print('It is a string')
else:
print('It is not a string.')
आप खाली स्ट्रिंग के साथ इसका परीक्षण कर सकते हैं:
def is_string(s):
try:
s += ''
except:
return False
return True
संपादित करें :
टिप्पणियों के बाद मेरे उत्तर को सही बताते हुए कि यह सूचियों के साथ विफल रहता है
def is_string(s):
return isinstance(s, basestring)
स्ट्रिंग-पसंद के लिए एक अच्छा बतख-टाइपिंग दृष्टिकोण के लिए जो पायथन 2.x और 3.x दोनों के साथ काम करने का बोनस है:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
वारफिश डक-टाइपिंग के करीब था इससे पहले कि वह isinstance
दृष्टिकोण पर स्विच करता है, सिवाय इसके कि +=
सूचियों के लिए अलग अर्थ +
है।
isalpha
, लेकिन कौन जानता है कि किन तरीकों की तलाश करना सुरक्षित होगा?
__str__
विधि प्लस समानता वास्तव में मूर्खतापूर्ण साबित हो सकती है। लेकिन यह भी कि बिना caveats के नहीं है।
try
तो तेज हो सकता है। यदि आप इसे 99% समय की उम्मीद करते हैं, तो शायद नहीं। प्रदर्शन अंतर न्यूनतम होना, मुहावरेदार होना बेहतर है जब तक आप अपने कोड को प्रोफाइल नहीं करते हैं और इसे वास्तव में धीमा होने की पहचान करते हैं।
if type(varA) == str or type(varB) == str:
print 'string involved'
EDX से - ऑनलाइन पाठ्यक्रम MITx: 6.00.1x कंप्यूटर विज्ञान का परिचय और पायथन का उपयोग करके प्रोग्रामिंग
str
!