পাইথন অবজেক্ট স্ট্রিং কিনা তা কীভাবে সন্ধান করবেন?


402

পাইথন অবজেক্টটি স্ট্রিং (নিয়মিত বা ইউনিকোড) কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


18
জেসন যা উল্লেখ করছে তা হাঁসের টাইপিং (এটি যদি হাঁসের মতো ঝাঁকুনি দেয় তবে এটি সম্ভবত হাঁস)। পাইথনে আপনি প্রায়শই কোনও স্ট্রিং-জাতীয় অবজেক্টে স্ট্রিং বা স্ট্রিং সাবক্লাস কিনা তা পরীক্ষা করেই "আপনার কোডটি কাজ করতে দিন"। আরও তথ্যের জন্য, দেখুন: docs.python.org/glossary.html#term-duck-typing
বেন হোয়েট

4
এসও সম্পর্কে আমি এটাই পছন্দ করি। আমি সাধারণত একটি প্রশ্ন জিজ্ঞাসা করি, এর উত্তর দেওয়া হয় না, লোকেরা আমাকে বলে যে আমার যেভাবে এবং কেন করা উচিত নয় এবং আমি প্রোগ্রামার হিসাবে বেড়ে উঠি। =)
ফিজিক্সমাইকেল

24
+1: কেবলমাত্র একটি উত্তর খুব কমই প্রয়োজন হয়, এর অর্থ এই নয় যে প্রশ্নটি অবৈধ। যদিও, আমি মনে করি যে এখানে সাবধানতা অবলম্বন করা খুব দুর্দান্ত, তবে আমি মনে করি না যে এটি প্রশ্নটিকে হ্রাস করার উপযুক্ত।
ট্রেভর

17
পাইথনে এটি সম্ভবত টাইপ চেকিংয়ের সবচেয়ে বৈধ ব্যবহার। স্ট্রিংগুলি পুনরাবৃত্তিযোগ্য, সুতরাং অন্য যে কোনও উপায়ে তালিকা থেকে তাদের আলাদা করা একটি খারাপ ধারণা।
ওজ্রাক

3
অন্যান্য পুনরাবৃত্ত থেকে স্ট্রিং পৃথক করা প্রয়োজন যেখানে অবশ্যই আছে। উদাহরণস্বরূপ, পিপ্রিন্ট মডিউলটিতে প্রেটিপ্রিন্টারের উত্স কোডটি দেখুন।
saxman01

উত্তর:



178

পাইথন 2

কোনও বস্তু 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 দেখুন ।

অজগর প্রকারের জন্য যা যা আছে তা যাচাই করার প্রমিত উপায় কী তাও দেখুন ?


স্থানীয় ভেরিয়েবল '
স্ট্রিং

@ জোহঙ্কটজিক পাইথন 3 বনাম পাইথন 2। আপনাকে basestringপাই 2 ইন পরীক্ষা করা দরকার ।
এরিকবওয়ার্ক

170

পাইথন ঘ

পাইথন ৩.x basestringএ আর পাওয়া যায় না, যেমন strএকক স্ট্রিং টাইপ (পাইথন ২.x এর শব্দার্থবিজ্ঞান সহ unicode)।

পাইথন ৩.x এ পরীক্ষাটি ঠিক:

isinstance(obj_to_test, str)

এটি সরকারী রূপান্তর সরঞ্জামটির ফিক্স অনুসরণ করে2to3 : রূপান্তরিত basestringহচ্ছে str


94

পাইথন 2 এবং 3

(ক্রশ-সামঞ্জস্যপূর্ণ)

আপনি যদি পাইথন সংস্করণ (২.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
ডেভিড Nemeskey

1
বিটিডাব্লু চিট শীট পাইথন সংস্করণের সামঞ্জস্যের জন্য দুর্দান্ত এক সংস্থান।
ডেভিড নেমেস্কি

1
কোন আমদানি না ব্যবহার সম্পর্কে কি? প্রথমে চেষ্টা করুন basestringএবং তারপরে ফিরে যান str। যেমনdef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
isaacbernat

19

আমি এই উত্তরগুলি আরও খুঁজে পেয়েছি pythonic:

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

যেহেতু টাইপ অবজেক্টগুলি সিঙ্গলটন, তাই স্ট্রিম টাইপের সাথে বস্তুর তুলনা করতে ব্যবহার করা যেতে পারে


4
উত্তরাধিকারের কারণে এটি টাইপের পরীক্ষার সাধারণ প্রস্তাবিত উপায় নয়: isinstance(obj_to_test, str)স্পষ্টতই টাইপের জন্য পরীক্ষা করার জন্য বোঝানো হয়, এবং এটি অন্যান্য, নন-স্ট্রিং ক্ষেত্রে যেমন একই পদ্ধতি ব্যবহার করার সুবিধা অর্জন করে তবেই এটি।
এরিক হে লেবিগোট

14

একটি সুস্পষ্ টাইপ-পরীক্ষণের (এবং সেখান থেকে দূরে থাকতে চায় হয় তা থেকে দূরে থাকতে ভাল কারণ), সম্ভবত সবচেয়ে নিরাপদ স্ট্রিং প্রোটোকলের অংশ চেক করুন:

str(maybe_string) == maybe_string

এটি কোনও পুনরাবৃত্তযোগ্য বা পুনরুক্তির মাধ্যমে পুনরাবৃত্তি করবে না, এটি কোনও তালিকার তালিকার একটি স্ট্রিং কল করবে না এবং এটি স্ট্রিংয়ের মতো একটি স্ট্রিংকে সঠিকভাবে সনাক্ত করে ।

অবশ্যই অসুবিধা আছে। উদাহরণস্বরূপ, str(maybe_string)একটি ভারী গণনা হতে পারে। প্রায়শই, উত্তর এটি নির্ভর করে

সম্পাদনা: @ টিসিএল মন্তব্যে উল্লেখ করার সাথে সাথে প্রশ্নটি আসলে ইউনিকোড স্ট্রিং এবং বাইটস্ট্রিং উভয়ই সনাক্ত করার উপায় জিজ্ঞাসা করে। পাইথন ২-তে এই উত্তরটি ইউনিকোড স্ট্রিংগুলির ব্যতিক্রম ব্যর্থ হবে যেখানে অ- Falseএসকিআইআই অক্ষর রয়েছে এবং পাইথন 3 এ এটি সমস্ত বাইটস্ট্রিংয়ের জন্য ফিরে আসবে।


প্রতিনিধিত্বমূলক ডেটা দিয়ে সূচনা হওয়া অবজেক্টগুলির ক্ষেত্রে এটি প্রত্যাশার মতো কাজ করতে পারে না ... b = b'test'; r = str(b) == bযেখানে bএকই ডেটা ধারণ করে str(b)তবে (বাইটস অবজেক্ট হওয়া) স্ট্রিং হিসাবে বৈধতা দেয় না।
Tcll

@ টিসিএল রাইট, প্রশ্নটি আসলে "নিয়মিত বা ইউনিকোড" বলে। আমার ধারণা আমি এটি সঠিকভাবে পড়িনি didn't
21

11

আপনার ভেরিয়েবল এমন কিছু যা আপনার মতো হতে পারে তা পরীক্ষা করার জন্য:

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

দূরত্বের আউটপুট আপনাকে একটি বুলিয়ান সত্য বা মিথ্যা মান দেয় যাতে আপনি সেই অনুযায়ী সামঞ্জস্য করতে পারেন। প্রারম্ভিকভাবে ব্যবহার করে আপনি আপনার মানটির প্রত্যাশিত সংক্ষিপ্ত বিবরণটি পরীক্ষা করতে পারেন: প্রকার (গুলি) এটি আপনাকে 'str' টাইপ করে ফিরিয়ে দেবে যাতে আপনি এটিকে পার্থক্য ফাংশনে ব্যবহার করতে পারেন।


5

আমি অন্যদের উল্লেখ মতো হাঁসের-টাইপিং শৈলীতে এটি মোকাবেলা করতে পারি। আমি কীভাবে জানতে পারি যে একটি স্ট্রিং আসলেই একটি স্ট্রিং? ভাল, স্পষ্টতই এটি একটি স্ট্রিং রূপান্তর করে!

def myfunc(word):
    word = unicode(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

পাইথন ২.x এবং ৩.x উভয়ের সাথে কাজ করার বোনাস রয়েছে এমন স্ট্রিং-লাইকের জন্য একটি দুর্দান্ত হাঁস-টাইপিং পদ্ধতির জন্য:

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

ওয়াইফিশ ফিশটি হাঁস-টাইপিংয়ের সাথে ঘনিষ্ঠ হওয়ার আগে তিনি isinstanceপদ্ধতির দিকে চলে আসেন, +=তালিকাগুলির চেয়ে ভিন্ন ভিন্ন অর্থ ব্যতীত +


2
ভাল, আপনার দুটি ডাউনভোট রয়েছে এবং কেউই কোনও মন্তব্য দেয়নি। আমি নিম্নচোটিত হইনি তবে আপনার সমাধানটি আমার পছন্দ নয় কারণ: * খুব ভার্জোজ। এটি করার জন্য আপনার কোনও ক্রিয়া সংজ্ঞায়িত করার দরকার নেই। * ব্যয়বহুল। পারফরম্যান্সের জন্য ব্যতিক্রম ধরা ভাল নয়। * প্রবণ ত্রুটি. অন্যান্য অবজেক্ট অ্যাড প্রয়োগ করতে পারে , একটি স্ট্রিং দেখতে পারে এবং অন্য ধরণের ব্যতিক্রম উত্থাপন করতে পারে, যা টাইপআরর নয়।
সান্তিয়াগোবসুল্টো

এছাড়াও আপনি এখানে হাঁস-টাইপিং পদ্ধতির নিয়োগ দিচ্ছেন, যা খুব সুন্দর, তবে এমন কিছু খুঁজে বের করার জন্য ছুঁড়ে ফেলতে এবং ব্যতিক্রম ধরা শেষ করে, যা সুন্দর নয়।
অ্যালেক্সি টিগ্রেভ

স্ট্রিং-জাতীয় এবং স্ট্রিংয়ের কিছু অন্যান্য পুনরাবৃত্তির মধ্যে পার্থক্য করার পক্ষে এটি বৈধভাবে একমাত্র নিশ্চিত উপায়। কেউ এর মতো গুণাবলীর সন্ধান করতে পারে isalphaতবে কী পদ্ধতিগুলি সন্ধান করা নিরাপদ হবে কে জানে?
ক্লেক

আমি বুঝতে পেরেছি যে __str__পদ্ধতিটি সমতা সাম্যতা আসলে বোকা-প্রমাণ হতে পারে। তবে তাও সতর্কতা ছাড়া নয়।
ক্লেক

@ সানটিয়াগোবাসুল্টো ব্যতিক্রম পাইথনে সস্তা। যদি আপনি সময়ের 1% ত্রুটিটি আশা করেন tryতবে দ্রুত হতে পারে। আপনি যদি এটির 99% সময় আশা করেন তবে নাও পারেন। পারফরম্যান্সের পার্থক্যটি ন্যূনতম হচ্ছে, আপনি নিজের কোডটি প্রোফাইল না করে এবং এটিকে সত্যই ধীর বলে চিহ্নিত না করাতে মুশকিল হওয়া ভাল।
নিক টি

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

EDX থেকে - অনলাইন কোর্স এমআইটিএক্স: 6.00.1x কম্পিউটার সায়েন্স এবং পাইথন ব্যবহার করে প্রোগ্রামিংয়ের পরিচিতি


6
এটি চেক করার সম্ভবত সবচেয়ে খারাপ উপায়। এটি কেবল ইউনিকোড অবজেক্টকেই বাদ দেয় না, এমনকি এটির সাবক্লাসগুলিও বাদ দেয় str!
আগস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.