Saya sadar bahwa saya dapat menggunakan: isinstance(x, str)
di python-3.x tapi saya perlu memeriksa apakah ada string di python-2.x juga. Akan isinstance(x, str)
bekerja seperti yang diharapkan di python-2.x? Atau apakah saya perlu memeriksa versi dan menggunakan isinstance(x, basestr)
?
Secara khusus, dalam python-2.x:
>>>isinstance(u"test", str)
False
dan python-3.x tidak punya u"foo"
python
string
python-3.x
python-2.x
Randall Hunt
sumber
sumber
Jawaban:
Jika Anda menulis kode yang kompatibel dengan 2.x-dan-3.x, Anda mungkin ingin menggunakan enam :
sumber
>>> isinstance(u"foo", string_types)
True
>>> isinstance(u"foo".encode("utf-8"), string_types)
True
Saya mengharapkan isinstance (u "foo", string_types) mengembalikan false.str
danunicode
menggunakan Python 2, ataustr
Python 3. Jika Anda tidak inginunicode
mengandalkan Python 2, gunakan sajastr
.future
paket alih-alihsix
:from future.utils import string_types
Pendekatan paling singkat yang saya temukan tanpa bergantung pada paket seperti enam, adalah:
kemudian, dengan anggapan Anda telah memeriksa string dengan Python 2 dengan cara yang paling umum,
sekarang juga akan berfungsi untuk Python 3+.
sumber
basestring = (str, bytes)
darirequests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
Bagaimana dengan ini, bekerja dalam semua kasus?
sumber
from __future__ import unicode_literals
aktif. Sekarang saya akan dengan:isinstance(val, (str, u"".__class__))
Ini adalah jawaban @Lev Levitsky, ditulis ulang sedikit.
The
try
/except
uji dilakukan sekali, dan kemudian mendefinisikan fungsi yang selalu bekerja dan secepat mungkin.EDIT: Sebenarnya, kita bahkan tidak perlu menelepon
isinstance()
; kita hanya perlu mengevaluasibasestring
dan melihat apakah kita mendapatkanNameError
:Saya pikir lebih mudah untuk mengikuti panggilan
isinstance()
.sumber
isinstance("", basestring)
adalah apa yang saya maksud dengan "panggilan". Pokoknya, +1.try: string_types = basestring except NameError: string_types = str
The
future
perpustakaan menambahkan (untuk Python 2) nama-nama yang kompatibel , sehingga Anda dapat melanjutkan menulis Python 3 . Anda dapat dengan mudah melakukan hal berikut:Untuk menginstalnya , jalankan saja
pip install future
.Sebagai peringatan , itu hanya mendukung
python>=2.6
,>=3.3
tetapi itu lebih modern daripadasix
yang hanya disarankan jika menggunakanpython 2.5
sumber
Mungkin menggunakan solusi seperti
sumber
isinstance(u'hello', basestr)
menghasilkanSyntaxError: invalid syntax
bagi saya dengan Python 3.2.3 di bawah Window 7 .. tahu mengapa ini terjadi? Sepertinya tidak sukau
- Saya mendapatkan kesalahan ini denganstr
danbasestr
str
pada Python3 menurut definisi Unicode. Oleh karena itu, tidak adabasestring
tipe, makaNameError
yang tertangkap dalam cuplikan saya.try
/except
tes satu kali, dan berdasarkan hasil dari tes tunggal, Anda mendefinisikanisstr()
dengan benar. Tidak perlu mengeluarkan overhead pengecualian untuk setiap panggilanisstr()
.Anda bisa mendapatkan kelas suatu objek dengan memanggil
object.__class__
, jadi untuk memeriksa apakah objek adalah tipe string default:Dan Anda dapat menempatkan yang berikut ini di bagian atas kode Anda sehingga string yang dilampirkan dengan tanda kutip berada dalam unicode dengan python 2:
sumber
some_element.text
adalah 'str' tetapi perbandingan dengan 'unicode' akan gagalAnda dapat mencoba ini di awal kode Anda:
dan kemudian dalam kode:
sumber
Hati-hati! Dalam python 2,
str
danbytes
pada dasarnya sama. Ini dapat menyebabkan bug jika Anda mencoba untuk membedakan keduanya.sumber
ketik (string) == str
mengembalikan true jika string, dan false jika tidak
sumber
string
ada string unicode