পাইথন অবজেক্টটি স্ট্রিং (নিয়মিত বা ইউনিকোড) কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
পাইথন অবজেক্টটি স্ট্রিং (নিয়মিত বা ইউনিকোড) কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
উত্তর:
কোনও বস্তু 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
পাই 2 ইন পরীক্ষা করা দরকার ।
আপনি যদি পাইথন সংস্করণ (২.x বনাম ৩.x) এর জন্য কোন গুরুত্ব না দিয়ে পরীক্ষা করতে চান, six
( পিপিআই ) এবং এর 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
আমি এই উত্তরগুলি আরও খুঁজে পেয়েছি pythonic
:
if type(aObject) is str:
#do your stuff here
pass
যেহেতু টাইপ অবজেক্টগুলি সিঙ্গলটন, তাই স্ট্রিম টাইপের সাথে বস্তুর তুলনা করতে ব্যবহার করা যেতে পারে
isinstance(obj_to_test, str)
স্পষ্টতই টাইপের জন্য পরীক্ষা করার জন্য বোঝানো হয়, এবং এটি অন্যান্য, নন-স্ট্রিং ক্ষেত্রে যেমন একই পদ্ধতি ব্যবহার করার সুবিধা অর্জন করে তবেই এটি।
একটি সুস্পষ্ টাইপ-পরীক্ষণের (এবং সেখান থেকে দূরে থাকতে চায় হয় তা থেকে দূরে থাকতে ভাল কারণ), সম্ভবত সবচেয়ে নিরাপদ স্ট্রিং প্রোটোকলের অংশ চেক করুন:
str(maybe_string) == maybe_string
এটি কোনও পুনরাবৃত্তযোগ্য বা পুনরুক্তির মাধ্যমে পুনরাবৃত্তি করবে না, এটি কোনও তালিকার তালিকার একটি স্ট্রিং কল করবে না এবং এটি স্ট্রিংয়ের মতো একটি স্ট্রিংকে সঠিকভাবে সনাক্ত করে ।
অবশ্যই অসুবিধা আছে। উদাহরণস্বরূপ, str(maybe_string)
একটি ভারী গণনা হতে পারে। প্রায়শই, উত্তর এটি নির্ভর করে ।
সম্পাদনা: @ টিসিএল মন্তব্যে উল্লেখ করার সাথে সাথে প্রশ্নটি আসলে ইউনিকোড স্ট্রিং এবং বাইটস্ট্রিং উভয়ই সনাক্ত করার উপায় জিজ্ঞাসা করে। পাইথন ২-তে এই উত্তরটি ইউনিকোড স্ট্রিংগুলির ব্যতিক্রম ব্যর্থ হবে যেখানে অ- False
এসকিআইআই অক্ষর রয়েছে এবং পাইথন 3 এ এটি সমস্ত বাইটস্ট্রিংয়ের জন্য ফিরে আসবে।
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)
...
যদি আরগটি ইতিমধ্যে একটি স্ট্রিং বা ইউনিকোড টাইপ হয় তবে রিয়েল_ওয়ার্ডটি এর মানটি অবিস্মরণিত করে। যদি পাস করা অবজেক্ট কোনও __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)
পাইথন ২.x এবং ৩.x উভয়ের সাথে কাজ করার বোনাস রয়েছে এমন স্ট্রিং-লাইকের জন্য একটি দুর্দান্ত হাঁস-টাইপিং পদ্ধতির জন্য:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
ওয়াইফিশ ফিশটি হাঁস-টাইপিংয়ের সাথে ঘনিষ্ঠ হওয়ার আগে তিনি isinstance
পদ্ধতির দিকে চলে আসেন, +=
তালিকাগুলির চেয়ে ভিন্ন ভিন্ন অর্থ ব্যতীত +
।
isalpha
তবে কী পদ্ধতিগুলি সন্ধান করা নিরাপদ হবে কে জানে?
__str__
পদ্ধতিটি সমতা সাম্যতা আসলে বোকা-প্রমাণ হতে পারে। তবে তাও সতর্কতা ছাড়া নয়।
try
তবে দ্রুত হতে পারে। আপনি যদি এটির 99% সময় আশা করেন তবে নাও পারেন। পারফরম্যান্সের পার্থক্যটি ন্যূনতম হচ্ছে, আপনি নিজের কোডটি প্রোফাইল না করে এবং এটিকে সত্যই ধীর বলে চিহ্নিত না করাতে মুশকিল হওয়া ভাল।
if type(varA) == str or type(varB) == str:
print 'string involved'
EDX থেকে - অনলাইন কোর্স এমআইটিএক্স: 6.00.1x কম্পিউটার সায়েন্স এবং পাইথন ব্যবহার করে প্রোগ্রামিংয়ের পরিচিতি
str
!