Python nesnesinin bir dize olup olmadığını nasıl kontrol edebilirim (normal veya Unicode)?
Python nesnesinin bir dize olup olmadığını nasıl kontrol edebilirim (normal veya Unicode)?
Yanıtlar:
Bir nesnenin o
dize türünde bir alt sınıfın dize türü olup olmadığını kontrol etmek için :
isinstance(o, basestring)
çünkü her ikisi str
ve unicode
alt sınıflarıdır basestring
.
Türünün o
tam olarak olup olmadığını kontrol etmek için str
:
type(o) is str
Aşağıdaki öğelerin o
bir örneğinin str
veya alt sınıfının olup olmadığını denetlemek için str
:
isinstance(o, str)
Unicode dizeleri için yukarıda da iş değiştirmek durumunda str
olan unicode
.
Ancak, hiçbir zaman açık tip denetimi yapmanız gerekmeyebilir. "Ördek yazarak" ihtiyaçlarınızı karşılayabilir. Bkz. Http://docs.python.org/glossary.html#term-duck-typing .
Ayrıca bkz . Python türünü kontrol etmenin standart yolu nedir?
basestring
Py2'de kontrol etmeniz gerekiyor .
Python 3.x'te tek dize türü basestring
gibi artık kullanılamaz str
(Python 2.x'lerin semantiği ile unicode
).
Python 3.x'teki check sadece:
isinstance(obj_to_test, str)
Bu şu düzeltmeyi resmi bir 2to3
dönüşüm aracı: dönüştürme basestring
için str
.
Python sürümüne (2.x ve 3.x) bakmaksızın kontrol etmek istiyorsanız, six
( PyPI ) ve string_types
özelliğini kullanın:
import six
if isinstance(obj, six.string_types):
print('obj is a string!')
İçinde six
(çok hafif tek dosya modülü), sadece yapıyor bu :
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str
else:
string_types = basestring
future
( PyPI ) kullanabilirsiniz :from past.builtins import basestring
basestring
ve sonra geri gidin str
. Örndef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
Bu ve daha fazlasını buldum pythonic
:
if type(aObject) is str:
#do your stuff here
pass
Yazım nesneleri singleton olduğundan , nesneyi str türüyle karşılaştırmak için kullanılabilir
isinstance(obj_to_test, str)
açık bir şekilde yazımın test edilmesi amaçlanmıştır ve diğer str olmayan durumlarla aynı prosedürü kullanma avantajına sahiptir.
Birisi açık tip kontrolünden uzak durmak istiyorsa (ve bundan uzak durmak için iyi nedenler varsa), muhtemelen kontrol etmek için dize protokolünün en güvenli kısmı:
str(maybe_string) == maybe_string
Sırasıyla bu liste-of-the dizeleri bir dize çağrı olmaz değil yinelerler bir iterable veya Yineleyici yoluyla olur ve doğru bir tespit stringlike dize olarak.
Tabii ki dezavantajları var. Örneğin, str(maybe_string)
ağır bir hesaplama olabilir. Sıkça olduğu gibi , cevap buna bağlıdır .
DÜZENLEME: As @Tcll işaret yorumlarda, soru aslında unicode dizeleri ve bytestrings hem algılamak için bir yol sorar. Python 2'de bu cevap ASCII olmayan karakterler içeren unicode dizeleri için bir istisna ile başarısız olur ve Python 3'te False
tüm bytestringler için geri döner.
b = b'test'; r = str(b) == b
burada b
aynı verileri tutar, str(b)
ancak (bayt nesnesi olarak) bir dize olarak doğrulanmaz.
Değişkeninizin bir şey olup olmadığını kontrol etmek için:
s='Hello World'
if isinstance(s,str):
#do something here,
Direnç çıkışı size boolean True veya False değeri verecektir, böylece buna göre ayarlama yapabilirsiniz. Başlangıçta aşağıdakileri kullanarak değerinizin beklenen kısaltmasını kontrol edebilirsiniz: type (s) Bu, isistance işlevinde kullanabilmeniz için 'str' türünü döndürür.
Bunu, diğerlerinin de belirttiği gibi, ördek yazım tarzında ele alabilirim. Bir dizenin gerçekten bir dize olduğunu nasıl bilebilirim? iyi, açıkça bir dizeye dönüştürerek !
def myfunc(word):
word = unicode(word)
...
Arg zaten bir dize veya unicode tipiyse, real_word değerini değiştirmeden tutar. Aktarılan nesne bir __unicode__
yöntem uygularsa , bu onun unicode temsilini almak için kullanılır. Geçirilen nesne dize olarak kullanılamazsa, unicode
yerleşik bir istisna oluşturur.
isinstance(your_object, basestring)
nesneniz gerçekten bir dize türüyse True olur. 'str' ayrılmış kelimedir.
özür dilerim, doğru cevap, diğer yanıtlayıcılardan biri tarafından yukarıda belirtildiği gibi, unicode dizeleri de içermesi için 'str' yerine 'basestring' kullanmaktır.
Bu akşam , tipe karşı kontrol etmek zorunda kalacağımı düşündüğüm bir durumla karşılaştım str
, ama öyle olmadı.
Sorunu çözme yaklaşımım muhtemelen birçok durumda işe yarayacaktır, bu yüzden bu soruyu okuyan diğerlerinin ilgilenmesi durumunda aşağıda sunuyorum (sadece Python 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
Bazı testler:
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
Basit, aşağıdaki kodu kullanın (obj olarak belirtilen nesnenin var olduğunu varsayıyoruz)
if type(obj) == str:
print('It is a string')
else:
print('It is not a string.')
Boş bir dize ile birleştirerek test edebilirsiniz:
def is_string(s):
try:
s += ''
except:
return False
return True
Düzenle :
Bunun listelerde başarısız olduğunu belirten yorumlardan sonra cevabımı düzeltiyorum
def is_string(s):
return isinstance(s, basestring)
Hem Python 2.x hem de 3.x ile çalışma bonusu olan dize beğenileri için hoş bir ördek yazma yaklaşımı için:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
bilge balıklarisinstance
yaklaşıma geçmeden önce ördek yazmaya yakındı , ancak +=
listeler için olduğundan farklı bir anlamı +
var.
isalpha
aranabilir, ancak hangi yöntemlerin güvenli bir şekilde aranacağını kim bilebilir?
try
1'ini beklerseniz , daha hızlı olabilir. Eğer zamanın% 99'unu bekliyorsanız, belki değil. Performans farkı minimum olduğundan, kodunuzun profilini ve gerçekte yavaş olduğunu tanımlamadığınız sürece deyimsel olmak daha iyidir.
if type(varA) == str or type(varB) == str:
print 'string involved'
EDX - online course MITx: 6.00.1x Python Kullanarak Bilgisayar Bilimi ve Programlamaya Giriş
str
!