ভেরিয়েবলটি পাইথন 2 এবং 3 সামঞ্জস্যের সাথে স্ট্রিং করছে কিনা তা কীভাবে পরীক্ষা করবেন


171

আমি সচেতন যে আমি ব্যবহার করতে পারি: isinstance(x, str)পাইথন -৩.x এ তবে পাইথন -২.x এও কিছু স্ট্রিং আছে কিনা তা আমার খতিয়ে দেখা উচিত। isinstance(x, str)পাইথন -২.এক্সে প্রত্যাশার মতো কাজ করবে ? অথবা আমার কি সংস্করণটি পরীক্ষা করে ব্যবহার করতে হবে isinstance(x, basestr)?

বিশেষত, পাইথন -২.x:

>>>isinstance(u"test", str)
False

এবং পাইথন -3.x নেই u"foo"


2
ইউনিকোড
লিটারালসের

অস্বাভাবিক. পাইথন ২.7.১.1 এ আমি is `` >>> isinstance (u "পরীক্ষা", বেসস্ট্রিং) সত্য ``
get

উত্তর:


209

আপনি যদি 2.x-and-3.x- সামঞ্জস্যপূর্ণ কোড লিখছেন তবে আপনি সম্ভবত ছয়টি ব্যবহার করতে চাইবেন :

from six import string_types
isinstance(s, string_types)

দুঃখিত আমি নিম্নলিখিত ফলাফল সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছি। >>> isinstance(u"foo", string_types) True >>> isinstance(u"foo".encode("utf-8"), string_types) True আমি প্রত্যাশা করছিলাম আইসনস্ট্যান্স (u "foo", স্ট্রিং_ টাইপগুলি) মিথ্যা প্রত্যাবর্তন।
চ্যান্ডলারের.হুয়াং

1
@ চ্যান্ডলআর.হুয়াং এই প্রশ্নটি সনাক্তকরণ strএবং unicodeপাইথন 2, বা strপাইথন 3 সম্পর্কে If আপনি যদি unicodeপাইথন 2 তে গণনা করতে না চান , কেবল ব্যবহার করুন str
ইকামত্মার

@ ক্যাটমুর ওহর করলেন, ধন্যবাদ! এটি মুছে ফেলা হয়েছে, তাই
নুন

4
আপনি এটির futureপরিবর্তে প্যাকেজ থেকেও এটি ব্যবহার করতে পারেন six:from future.utils import string_types
সুপারজিও

113

ছয়টির মতো প্যাকেজের উপর নির্ভর না করে আমি যে সর্বাধিক সংবেদনশীল পন্থা পেয়েছি তা হ'ল:

try:
  basestring
except NameError:
  basestring = str

তারপরে, ধরে নিই যে আপনি পাইথন 2 এ স্ট্রিংগুলি সর্বাধিক জেনারিক পদ্ধতিতে পরীক্ষা করছেন,

isinstance(s, basestring)

পাইথন 3+ এর জন্যও এখন কাজ করবে।


10
পাই 3 এর জন্যbasestring = (str, bytes)requests/compat.py

ভাল লাগছে, তবে কেন? পাইথন 3 এখানে পিছনে-সামঞ্জস্যপূর্ণ হলে ভাল লাগবে। উপরে সমাধান কাজ করে। আরও ভাল হবে, যদি এটির প্রয়োজন না হত।
গেটল্লি

2
পাই 2 এবং 3 সমর্থন এবং মাইপি উভয়কে সন্তুষ্ট করতে, আমি শেষ করেছিif not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
ডেভ লি

35

এটি সম্পর্কে কি, সব ক্ষেত্রে কাজ করে?

isinstance(x, ("".__class__, u"".__class__))

@ হোল্ডেনওয়েব: না এবং হ্যাঁ - একটি নিফটি "হ্যাক আমি মনে করি যেখানে কেবল প্রয়োজন" imp
দ্বিচলিত

1
কারণ আমি এই উত্তর চাই যে এটা python2 থেকে 3. মাইগ্রেট সঙ্গে বন্ধুত্বপূর্ণ হয়
Tiagojdferreira

4
আমি এই বিকল্পটি দিয়েছিলাম, এটি একটি সহায়ক ফাংশনে মুড়িয়ে রেখেছি, সুতরাং এটি কেবল একবার উপস্থিত হয়, এবং ফিল্টকে ক্রেডিট করার জন্য ডক্টরসিতে একটি জায়গা রয়েছে।
কার্ল স্মিথ

2
ঝরঝরে এবং আমি নিজেও এটি ব্যবহার করছিলাম, যতক্ষণ না বুঝেছিলাম যে আমারও from __future__ import unicode_literalsসক্রিয় রয়েছে। এখন আমি যাচ্ছি:isinstance(val, (str, u"".__class__))
গ্রাহাম ক্লিন

18

এটি @ লাইভ লেভিটস্কির উত্তর, পুনরায় কিছুটা লেখা।

try:
    isinstance("", basestring)
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

try/ exceptপরীক্ষা একবার সম্পন্ন করা হয়, এবং তারপর একটি ফাংশন যে সবসময় কাজ করে এবং যতটা সম্ভব দ্রুত সংজ্ঞায়িত করে।

সম্পাদনা: আসলে আমাদের কল করার দরকার নেই isinstance(); আমাদের কেবল মূল্যায়ন করতে হবে basestringএবং দেখুন যে আমরা একটি পেয়েছি কিনা NameError:

try:
    basestring  # attempt to evaluate basestring
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

যদিও আমি মনে করি কলটিতে অনুসরণ করা আরও সহজ isinstance()


isinstance("", basestring)আমি "কলিং" বলতে বোঝাতে চাইছি। যাইহোক, +1।
লেভ লেভিটস্কি

1
পাইথন একটি অত্যন্ত গতিশীল ভাষা, এবং আমি মনে করি না যে এটির মতো পরীক্ষা নেওয়া মোটেই খারাপ লাগে। এটি একবারে কিছু বের করার জন্য একটি দরকারী কৌশল এবং তার উপর ভিত্তি করে, একটি ক্রিয়াকলাপ স্থাপন করুন যা সর্বদা সঠিক হবে। +1 এর জন্য ধন্যবাদ।
স্টিভাহ

5
আমি এটি try: string_types = basestring except NameError: string_types = str
লিখেছি

12

futureগ্রন্থাগার (পাইথন 2) যোগ সামঞ্জস্যপূর্ণ নাম , তাই আপনি করতে পারেন লেখার পাইথন 3 অবিরত । আপনি নিম্নলিখিতটি সহজ করতে পারেন:

from builtins import str
isinstance(x, str) 

এটি ইনস্টল করতে , কেবল চালিত করুন pip install future

হিসেবে সতর্কীকরণ , এটি শুধুমাত্র সমর্থন python>=2.6, >=3.3কিন্তু চেয়ে বেশি আধুনিক sixযা শুধুমাত্র হয়, ব্যবহার করা হয় তবে সুপারিশpython 2.5


8

সম্ভবত একটি workaround ব্যবহার করুন

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)

আপনাকে বাগ দেওয়ার জন্য দুঃখিত তবে উইন্ডো 7 এর অধীনে পাইথন ৩.২.৩ দিয়ে আমার জন্য isinstance(u'hello', basestr)ফলন SyntaxError: invalid syntaxহয়েছে .. কেন এমন ধারণা কেন হবে? মনে হচ্ছে বলে মনে হচ্ছে না u- আমি এই ভুল পান strএবংbasestr
Levon

1
@ লাইভন সমস্যা নেই :) কারণ পাইথন 3-তে সেই সিনট্যাক্স নেই , যেমন strপাইথন 3-তে সংজ্ঞা ইউনিকোড। তদনুসারে, কোনও basestringপ্রকার নেই, তাই এটি NameErrorআমার স্নিপেটে ধরা পড়ে।
লেভ লেভিটস্কি

এটি এখন নূপ হিসাবে সিনট্যাক্স আছে। ৩.৩-এ
র্যান্ডল হান্ট

2
আমি একবার try/ exceptপরীক্ষা করার পরামর্শ দিচ্ছি , এবং সেই একক পরীক্ষার ফলাফলের ভিত্তিতে, আপনি isstr()সঠিকভাবে সংজ্ঞা দিন । প্রতিটি কলটিতে ব্যতিক্রমের ওভারহেড ব্যয় করার প্রয়োজন নেই isstr()
স্টিভেহা

@ রানম্যান পাইথন ৩.৩ সম্পর্কে ঠিক বলেছেন, এখানে পিইপি- র একটি লিঙ্ক রয়েছে ।
লেভ লেভিটস্কি

7

আপনি কল করে কোনও বস্তুর শ্রেণি পেতে পারেন object.__class__, যাতে বস্তুটি ডিফল্ট স্ট্রিংয়ের ধরণ কিনা তা পরীক্ষা করার জন্য:

    isinstance(object,"".__class__)

এবং আপনি নিম্নলিখিতটি আপনার কোডের শীর্ষে রাখতে পারেন যাতে উদ্ধৃতি দ্বারা আবদ্ধ স্ট্রিংগুলি অজগর 2 এ ইউনিকোডে থাকে:

    from __future__ import unicode_literals

আমি এই সমাধান বেশ কিছুটা। আমি খুঁজে পেলাম যে str = "" .__ শ্রেণি__, যা এখন isinstance (অবজেক্ট, str) কে সাধারণত লেখার অনুমতি দেয় এবং এটিও নিশ্চিত করে যে str (অবজেক্ট) পাইথন 2 এবং পাইথন 3 উভয়টিতে একটি ইউনিকোড স্ট্রিং ফিরিয়ে দেবে ens
amicitas

এক্সএমএল পার্স করার সময় এটি কাজ করে না: some_element.textএটি 'স্ট্র' তবে 'ইউনিকোড' এর সাথে তুলনা ব্যর্থ হবে
ভল্ট

উপর পাইথন 2 ইউনিকোড স্ট্রিং সঙ্গে Does't কাজ: isinstance (u'XXX ',' '.__ class__) == মিথ্যা
ফীল

0

আপনি আপনার কোডের শুরুতে এটি চেষ্টা করতে পারেন:

from __future__ import print_function
import sys
if sys.version[0] == "2":
    py3 = False
else:
    py3 = True
if py3: 
    basstring = str
else:
    basstring = basestring

এবং পরে কোডে:

anystring = "test"
# anystring = 1
if isinstance(anystring, basstring):
    print("This is a string")
else:
    print("No string")

0

সতর্ক হোন! অজগর 2 এ strএবং bytesমূলত একই রকম। আপনি যদি উভয়ের মধ্যে পার্থক্য করার চেষ্টা করছেন তবে এটি একটি বাগ তৈরি করতে পারে।

>>> size = 5    
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True

-4

টাইপ (স্ট্রিং) == স্ট্রিং

যদি এটির একটি স্ট্রিং সত্য হয় এবং মিথ্যা না হলে এটি প্রত্যাবর্তন করে


1
পাইথন 2 এর ক্ষেত্রে সত্য নয়, যেখানে stringএকটি ইউনিকোড স্ট্রিং রয়েছে
lxop
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.