@ Yarin: Tidak. Tapi itu tidak masalah, karena Python 3.x tidak dimaksudkan untuk kompatibel dengan Python 2.x sama sekali.
netcoder
2
Saya menemukan bahwa isinstance (s, str) bekerja dengan py27, diuji pada: Python 2.7.5 (default, 25 Agustus 2013, 00:04:04) [GCC 4.2.1 Kompatibel Apple LLVM 5.0 (clang-500.0.68)] pada darwin.
kakyo
25
@ kakyo: Masalahnya adalah ia akan kehilangan unicodeobjek, yang juga harus dianggap sebagai string. Baik tipe strdan tipe unicodememiliki kelas dasar umum basestring, dan ini adalah apa yang ingin Anda periksa.
Sven Marnach
7
@Yarin jika Anda memindahkan sesuatu dari 2.x ke 3.x, Anda selalu dapat menetapkan basestring = str.
Jack
9
@AdamErickson Untuk kompatibilitas dengan apa sebenarnya? Tidak membantu untuk kompatibilitas dengan Python 3, karena tidak ada unicodedalam Python 3. Rekomendasi saya untuk kompatibilitas antara Python 2 dan 3 adalah dengan menggunakan pustaka "enam". (Khususnya isintance(s, six.string_types)dalam hal ini)
Sven Marnach
222
Saya tahu ini adalah topik lama, tetapi menjadi yang pertama ditampilkan di google dan mengingat bahwa saya tidak menemukan jawaban yang memuaskan, saya akan meninggalkan ini di sini untuk referensi di masa mendatang:
six adalah pustaka kompatibilitas Python 2 dan 3 yang sudah membahas masalah ini. Anda kemudian dapat melakukan sesuatu seperti ini:
import six
if isinstance(value, six.string_types):pass# It's a string !!
Misalnya untuk satu liner:, di value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)mana >=mengasumsikan setiap Python 4+ akhirnya membuat strkelas root untuk string.
Saya suka keanggunan "if type (x) in (str, unicode):", tapi saya melihat PyLint memberi tanda sebagai "tidak otomatis".
eukra,
15
Membandingkan jenis dengan ==secara eksplisit tidak disarankan oleh PEP8, dan memiliki beberapa kelemahan selain dianggap "tidak otomatis", misalnya tidak mendeteksi turunan dari subkelas str, yang juga harus dianggap sebagai string. Jika Anda benar-benar ingin memeriksa dengan tepat jenis strdan secara eksplisit mengecualikan subclass, gunakan type(x) is str.
Sven Marnach
17
Anda dapat melakukan:
var =1if type(var)== int:print('your variable is an integer')
atau:
var2 ='this is variable #2'if type(var2)== str:print('your variable is a string')else:print('your variable IS NOT a string')
Tangkapan yang bagus. Saya tidak tahu tentang basestring. Disebutkan sekitar 3 posting ke bawah dan sepertinya jawaban yang lebih baik.
Wade Hatler
6
isinstance()juga mengambil tuple sebagai argumen kedua. Jadi, bahkan jika basestringtidak ada, Anda bisa menggunakannya isinstance(target, (str, unicode)).
Martijn Pieters
3
Dalam python 3.5.1, unicodetampaknya tidak didefinisikan:NameError: name 'unicode' is not defined
Eric Hu
11
karena basestringtidak didefinisikan dalam Python3, trik kecil ini mungkin membantu membuat kode tersebut kompatibel:
try:# check whether python knows about 'basestring'
basestring
exceptNameError:# no, it doesn't (it's Python3); use 'str' instead
basestring=str
setelah itu Anda dapat menjalankan tes berikut pada Python2 dan Python3
Terima kasih banyak! Ada puluhan berbagai jawaban di internet tetapi satu-satunya yang baik adalah yang ini. Baris pertama secara default type('foo')menjadi unicodepython 2, dan baris kedua strmenjadi instance dari unicode. Mereka membuat kode valid dengan Python 2 dan 3. Terima kasih lagi!
Narann
9
Saya juga ingin memperhatikan bahwa jika Anda ingin memeriksa apakah jenis variabel adalah jenis tertentu, Anda dapat membandingkan jenis variabel dengan jenis objek yang dikenal.
Ini adalah cara yang sangat buruk untuk mengetik check in python. Bagaimana jika kelas lain mewarisi dari str? Bagaimana dengan string unicode, yang bahkan tidak diwarisi dari strdalam 2.x? Gunakan isinstance(s, basestring)dalam 2.x, atau isinstance(s, str)dalam 3.x.
Jack
1
@ Jack, tolong baca pertanyaan, dan perhatikan juga saya tidak menulis bahwa itu cara terbaik, hanya cara lain.
Daniil Grankin
9
Ini adalah ide yang buruk karena 3 alasan: isinstance()memungkinkan untuk subclass (yang merupakan string juga, hanya khusus), type('')panggilan ekstra itu berlebihan ketika Anda hanya dapat menggunakan strdan jenisnya adalah lajang, sehingga type(s) is strakan menjadi tes yang lebih efisien.
Martijn Pieters
8
Banyak saran bagus diberikan oleh orang lain di sini, tetapi saya tidak melihat ringkasan lintas platform yang baik. Yang berikut harus menjadi penurunan yang baik untuk program Python:
def isstring(s):# if we use Python 3if(sys.version_info[0]>=3):return isinstance(s, str)# we use Python 2return isinstance(s, basestring)
Dalam fungsi ini, kita gunakan isinstance(object, classinfo)untuk melihat apakah input kita adalah strdalam Python 3 atau basestringdalam Python 2.
Ini kemungkinan akan pecah di Python 4, pertimbangkan >=setidaknya.
thak
2
lebih bersih untuk memeriksa six.string_types atau six.text_type
daonb
@daonb mengimpor seluruh modul hanya untuk melakukan tes satu baris adalah pemikiran yang menyebabkan pohon ketergantungan gila dan mengasapi serius untuk merusak apa yang seharusnya menjadi sesuatu yang kecil dan sederhana. Ini panggilan Anda tentu saja, tapi hanya say'n ...
duanev
@devev jika Anda khawatir tentang kompatibilitas Python 2/3 itu ide yang lebih baik untuk menggunakan enam dalam proyek anyways. Enam juga satu file sehingga ketergantungan pohon / mengasapi tidak menjadi masalah di sini.
MoxieBall
7
Cara alternatif untuk Python 2, tanpa menggunakan basestring:
isinstance(s,(str, unicode))
Tetapi masih tidak akan berfungsi di Python 3 karena unicodetidak didefinisikan (dalam Python 3).
Untuk Python 2.7.12 saya harus menghapus tanda kutip: ketik (a) di [str, unicode]
Adam Erickson
4
Inilah jawaban saya untuk mendukung Python 2 dan Python 3 bersama dengan persyaratan berikut:
Ditulis dalam kode Py3 dengan kode compat Py2 minimal.
Hapus kode compat Py2 nanti tanpa gangguan. Yaitu bertujuan untuk penghapusan saja, tidak ada modifikasi ke kode Py3.
Hindari penggunaan sixatau modul compat serupa karena cenderung menyembunyikan apa yang ingin dicapai.
Bukti masa depan untuk Py4 potensial.
import sys
PY2 = sys.version_info.major ==2# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else(str, bytes))# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)
Anda cukup menggunakan fungsi isinstance untuk memastikan bahwa data input berupa format string atau unicode . Contoh di bawah ini akan membantu Anda untuk memahami dengan mudah.
type(str())adalah cara yang sangat tidak pasti untuk mengatakan str. Jenisnya lajang, jadi type(x) is strlebih efisien. isinstance()harus digunakan sebagai gantinya, kecuali jika Anda memiliki alasan yang sangat baik untuk mengabaikan subclass dari str.
Dalam hal akan Anda pilih type(thing).__name__ == 'str'lebih type(thing) == stratau isinstance(thing, str)? Juga unicodetidak ada dalam versi modern Python.
isinstance(True, int) is True
.isinstance(x,str)
benar dalam Python 3 (str adalah tipe dasar).Jawaban:
Dalam Python 2.x, Anda akan melakukannya
basestring
adalah superclass abstrak daristr
danunicode
. Ini dapat digunakan untuk menguji apakah suatu objek adalah turunan daristr
atauunicode
.Dalam Python 3.x, tes yang benar adalah
The
bytes
kelas tidak dianggap sebagai tipe string di Python 3.sumber
unicode
objek, yang juga harus dianggap sebagai string. Baik tipestr
dan tipeunicode
memiliki kelas dasar umumbasestring
, dan ini adalah apa yang ingin Anda periksa.basestring = str
.unicode
dalam Python 3. Rekomendasi saya untuk kompatibilitas antara Python 2 dan 3 adalah dengan menggunakan pustaka "enam". (Khususnyaisintance(s, six.string_types)
dalam hal ini)Saya tahu ini adalah topik lama, tetapi menjadi yang pertama ditampilkan di google dan mengingat bahwa saya tidak menemukan jawaban yang memuaskan, saya akan meninggalkan ini di sini untuk referensi di masa mendatang:
six adalah pustaka kompatibilitas Python 2 dan 3 yang sudah membahas masalah ini. Anda kemudian dapat melakukan sesuatu seperti ini:
Memeriksa kode, inilah yang Anda temukan:
sumber
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
mana>=
mengasumsikan setiap Python 4+ akhirnya membuatstr
kelas root untuk string.Dalam Python 3.x atau Python 2.7.6
sumber
==
secara eksplisit tidak disarankan oleh PEP8, dan memiliki beberapa kelemahan selain dianggap "tidak otomatis", misalnya tidak mendeteksi turunan dari subkelasstr
, yang juga harus dianggap sebagai string. Jika Anda benar-benar ingin memeriksa dengan tepat jenisstr
dan secara eksplisit mengecualikan subclass, gunakantype(x) is str
.Anda dapat melakukan:
atau:
semoga ini membantu!
sumber
Modul tipe juga ada jika Anda memeriksa lebih dari int dan string. http://docs.python.org/library/types.html
sumber
types.StringTypes
,.Edit berdasarkan jawaban yang lebih baik di bawah ini. Turunkan sekitar 3 jawaban dan cari tahu tentang kesejukan basestring.
Jawaban lama: Hati-hati dengan string unicode, yang bisa Anda dapatkan dari beberapa tempat, termasuk semua panggilan COM di Windows.
sumber
isinstance()
juga mengambil tuple sebagai argumen kedua. Jadi, bahkan jikabasestring
tidak ada, Anda bisa menggunakannyaisinstance(target, (str, unicode))
.unicode
tampaknya tidak didefinisikan:NameError: name 'unicode' is not defined
karena
basestring
tidak didefinisikan dalam Python3, trik kecil ini mungkin membantu membuat kode tersebut kompatibel:setelah itu Anda dapat menjalankan tes berikut pada Python2 dan Python3
sumber
basestring = (str, bytes)
Python 2/3 termasuk unicode
http://python-future.org/overview.html
sumber
type('foo')
menjadiunicode
python 2, dan baris keduastr
menjadi instance dariunicode
. Mereka membuat kode valid dengan Python 2 dan 3. Terima kasih lagi!Saya juga ingin memperhatikan bahwa jika Anda ingin memeriksa apakah jenis variabel adalah jenis tertentu, Anda dapat membandingkan jenis variabel dengan jenis objek yang dikenal.
Untuk string Anda bisa menggunakan ini
sumber
str
? Bagaimana dengan string unicode, yang bahkan tidak diwarisi daristr
dalam 2.x? Gunakanisinstance(s, basestring)
dalam 2.x, atauisinstance(s, str)
dalam 3.x.isinstance()
memungkinkan untuk subclass (yang merupakan string juga, hanya khusus),type('')
panggilan ekstra itu berlebihan ketika Anda hanya dapat menggunakanstr
dan jenisnya adalah lajang, sehinggatype(s) is str
akan menjadi tes yang lebih efisien.Banyak saran bagus diberikan oleh orang lain di sini, tetapi saya tidak melihat ringkasan lintas platform yang baik. Yang berikut harus menjadi penurunan yang baik untuk program Python:
Dalam fungsi ini, kita gunakan
isinstance(object, classinfo)
untuk melihat apakah input kita adalahstr
dalam Python 3 ataubasestring
dalam Python 2.sumber
>=
setidaknya.Cara alternatif untuk Python 2, tanpa menggunakan basestring:
Tetapi masih tidak akan berfungsi di Python 3 karena
unicode
tidak didefinisikan (dalam Python 3).sumber
Begitu,
Anda memiliki banyak opsi untuk memeriksa apakah variabel Anda adalah string atau tidak:
Pesanan ini untuk tujuan tertentu.
sumber
mengembalikan True
mengembalikan True
sumber
Inilah jawaban saya untuk mendukung Python 2 dan Python 3 bersama dengan persyaratan berikut:
six
atau modul compat serupa karena cenderung menyembunyikan apa yang ingin dicapai.sumber
Jika Anda tidak ingin bergantung pada lib eksternal, ini berfungsi baik untuk Python 2.7+ dan Python 3 ( http://ideone.com/uB4Kdc ):
sumber
Anda cukup menggunakan fungsi isinstance untuk memastikan bahwa data input berupa format string atau unicode . Contoh di bawah ini akan membantu Anda untuk memahami dengan mudah.
sumber
sumber
Beginilah cara saya melakukannya:
sumber
type(str())
adalah cara yang sangat tidak pasti untuk mengatakanstr
. Jenisnya lajang, jaditype(x) is str
lebih efisien.isinstance()
harus digunakan sebagai gantinya, kecuali jika Anda memiliki alasan yang sangat baik untuk mengabaikan subclass daristr
.Saya telah melihat:
sumber
sumber
type(thing).__name__ == 'str'
lebihtype(thing) == str
atauisinstance(thing, str)
? Jugaunicode
tidak ada dalam versi modern Python.