Değişken türünün dize olup olmadığını nasıl kontrol edebilirim?


766

Python'da bir değişkenin türünün a olup olmadığını kontrol etmenin bir yolu var mı string:

isinstance(x,int);

tamsayı değerleri için?


11
Eğer python canonical.org/~kragen/isinstance öğreniyorsanız, isinstance hakkında gerekli okuma .
whaley


O zamandan beri ints'a dikkat et isinstance(True, int) is True.
Albert Tugushev

isinstance(x,str)Python 3'te doğrudur (str temel bir tiptir).
MasterControlProgram

Yanıtlar:


1138

Python 2.x'te,

isinstance(s, basestring)

basestringolan soyut üst sınıf arasında strve unicode. Bir nesnenin strveya örneğinin olup olmadığını test etmek için kullanılabilir unicode.


Python 3.x'te doğru test

isinstance(s, str)

bytesSınıf Python 3'te bir dize türü olarak kabul edilmez.


10
@Yarin: Hayır. Ama önemli değil, çünkü Python 3.x'in Python 2.x ile hiç uyumlu olması amaçlanmamıştır.
netcoder

2
İsinstance (s, str) testinin py27 ile çalıştığını ve şu testlerde bulunduğunu gördüm: Python 2.7.5 (varsayılan, 25 Ağu 2013, 00:04:04) [GCC 4.2.1 Uyumlu Apple LLVM 5.0 (clang-500.0.68)] darwin'de.
kakyo

25
@kakyo: Sorun, unicodedize olarak da düşünülmesi gereken nesneleri özlemesidir . Hem tür strhem de tür unicodeortak taban sınıfına sahiptir basestringve kontrol etmek istediğiniz şey budur.
Sven Marnach

7
@Yarin, 2.x ile 3.x arasında bir şey taşıyorsanız, her zaman atayabilirsiniz basestring = str.
Jack

9
@AdamErickson Tam olarak ne ile uyumluluk için? Python 3'te uygun olmadığı için Python 3 ile uyumluluğa yardımcı olmaz unicode. Python 2 ve 3 arasındaki uyumluluk için önerim "altı" kütüphaneyi kullanmaktır. (Özellikle isintance(s, six.string_types)bu durumda)
Sven Marnach

222

Bunun eski bir konu olduğunu biliyorum, ancak google'da gösterilen ilk konu olarak ve cevapların hiçbirini tatmin edici bulamadığım göz önüne alındığında, ileride başvurmak için burada bırakacağım:

six , bu sorunu zaten kapsayan bir Python 2 ve 3 uyumluluk kütüphanesidir. Daha sonra böyle bir şey yapabilirsiniz:

import six

if isinstance(value, six.string_types):
    pass # It's a string !!

Kod incelendiğinde, bulduğunuz şey budur:

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,

4
Örneğin, bir astar için: value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)burada >=herhangi bir nihai Python 4+ 'nun strdizeler için kök sınıfını koruduğunu varsayar .
Pi Marillion

63

Python 3.x veya Python 2.7.6'da

if type(x) == str:

10
Ben "(str, unicode):" tür (x) şıklığı gibi, ama PyLint "unidiomatic" olarak bayraklar görüyorum.
eukras

15
Tipleri karşılaştırmak ==PEP8 tarafından açıkça caydırılır ve "tekdüzenli" olarak düşünülmeye ek olarak birkaç dezavantaja sahiptir, örneğin, alt sınıfların örneklerini tespit etmez str, bunlar da dize olarak düşünülmelidir. Tam olarak türü kontrol etmek strve alt sınıfları açıkça hariç tutmak istiyorsanız , kullanın type(x) is str.
Sven Marnach

17

yapabilirsin:

var = 1
if type(var) == int:
   print('your variable is an integer')

veya:

var2 = 'this is variable #2'
if type(var2) == str:
    print('your variable is a string')
else:
    print('your variable IS NOT a string')

Bu yardımcı olur umarım!



11

Aşağıdaki daha iyi cevaba göre düzenleyin. Yaklaşık 3 cevap aşağı gidin ve basestring serinliği hakkında bilgi edinin.

Eski yanıt: Windows'daki tüm COM çağrıları da dahil olmak üzere çeşitli yerlerden alabileceğiniz unicode dizelerine dikkat edin.

if isinstance(target, str) or isinstance(target, unicode):

1
İyi yakalama. Basestring hakkında bir şey bilmiyordum. 3 mesaj aşağı bahsedilir ve daha iyi bir yanıt gibi görünüyor.
Wade Hatler

6
isinstance()ayrıca ikinci argüman olarak bir demet alır . Yani olmasa bile basestring, sadece kullanabilirsiniz isinstance(target, (str, unicode)).
Martijn Pieters

3
Python 3.5.1'de unicodetanımlanmış gibi görünmüyor:NameError: name 'unicode' is not defined
Eric Hu

11

beri basestringPython3 tanımlı değil, bu küçük hile kodu uyumlu hale getirmek için yardımcı olabilir:

try: # check whether python knows about 'basestring'
   basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
   basestring=str

bundan sonra hem Python2 hem de Python3 üzerinde aşağıdaki testi çalıştırabilirsiniz

isinstance(myvar, basestring)

4
Veya bayt dizelerini de yakalamak istiyorsanız:basestring = (str, bytes)
Mark Ransom

10

Unicode dahil Python 2/3

from __future__ import unicode_literals
from builtins import str  #  pip install future
isinstance('asdf', str)   #  True
isinstance(u'asdf', str)  #  True

http://python-future.org/overview.html


1
Çok teşekkürler! İnternet çevresinde onlarca çeşitli cevap var ama tek iyi bu. İlk satır yapar type('foo')olmanın unicodepiton 2 varsayılan olarak, ikincisi marka strörneği olma unicode. Thoses kodu Python 2 ve 3'te geçerli kılar. Tekrar teşekkürler!
Narann

9

Ayrıca, bir değişkenin türünün belirli bir tür olup olmadığını kontrol etmek isterseniz, değişkenin türünü bilinen bir nesnenin türüyle karşılaştırabileceğinizi fark etmek isterim.

Dize için bunu kullanabilirsiniz

type(s) == type('')

7
Bu, check-in python yazmak için korkunç, korkunç bir yoldur. Ya başka bir sınıf miras alırsa str? str2.x sürümünden bile miras almamış unicode karakter dizilerine ne dersiniz ? isinstance(s, basestring)2.x veya isinstance(s, str)3.x sürümlerinde kullanın .
Jack

1
@Jack, lütfen soruyu okuyun ve bunun en iyi yol olduğunu yazmadığımı fark ettim, sadece başka bir yol.
Daniil Grankin

9
Bu 3 nedenden ötürü kötü bir fikirdir: isinstance()alt sınıflara izin verir (dizeler de vardır, sadece uzmanlaşmıştır), type('')sadece kullanabileceğinizde ekstra çağrı gereksizdir strve tipler tek tonludur, bu yüzden type(s) is strdaha verimli bir test olacaktır.
Martijn Pieters

8

Burada başkaları tarafından sağlanan çok iyi öneriler var, ancak iyi bir platformlar arası özet görmüyorum. Aşağıdaki herhangi bir Python programı için iyi bir düşüş olmalıdır:

def isstring(s):
    # if we use Python 3
    if (sys.version_info[0] >= 3):
        return isinstance(s, str)
    # we use Python 2
    return isinstance(s, basestring)

Bu işlevde, kullandığımız isinstance(object, classinfo)bizim girişi bir olup olmadığını görmek için strPython 3 ya da bir basestringPython 2'de.


1
Bu muhtemelen Python 4'te kırılacak, >=en azından düşünün .
thakis

2
six.string_types veya six.text_type
daonb

@daonb sadece tek satırlık bir test yapmak için bir modülün tamamını ithal etmek, çılgın bağımlılık ağaçlarının ve ciddi şişkinliğin kısa küçük ve basit bir şey olması gereken şeyi mahvetmesine neden olan düşüncedir. Tabii ki sizin çağrınız, ama sadece ...
duanev

@duanev Python 2/3 uyumluluğundan endişe duyuyorsanız, yine de projede altı tane kullanmak daha iyi bir fikirdir. Altı da tek bir dosyadır, bu nedenle bağımlılık ağaçları / şişkinlik burada bir sorun değildir.
MoxieBall

7

Basestring kullanmadan Python 2 için alternatif yol:

isinstance(s, (str, unicode))

Ancak Python 3'te unicodetanımlanmadığı için hala çalışmaz (Python 3'te).


7

Yani,

Değişkeninizin dize olup olmadığını kontrol etmek için birçok seçeneğiniz vardır:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

Bu sipariş amaçlıdır.


5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

True döndürür

type(a) in [str, unicode]

True döndürür


Python 2.7.12 için tırnak işaretlerini kaldırmak zorunda kaldım: [str, unicode] içindeki (a) türünü yazdım
Adam Erickson

4

Python 2 ve Python 3'ü bu gereksinimlerle birlikte desteklemek için cevabım:

  • En az Py2 uyumluluk kodu ile Py3 kodunda yazılmıştır.
  • Py2 uyumluluk kodunu daha sonra kesintisiz olarak kaldırın. Yani sadece silme amacı, Py3 kodunda değişiklik yok.
  • sixUlaşılmaya çalışılanı gizleme eğilimi gösterdiklerinden, benzer bir modül kullanmaktan kaçının .
  • Potansiyel bir Py4 için geleceğe dönük.

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)

1

Harici kütüphanelere bağımlı olmak istemiyorsanız, bu hem Python 2.7+ hem de Python 3 için çalışır ( http://ideone.com/uB4Kdc ):

# your code goes here
s = ["test"];
#s = "test";
isString = False;

if(isinstance(s, str)):
    isString = True;
try:
    if(isinstance(s, basestring)):
        isString = True;
except NameError:
    pass;

if(isString):
    print("String");
else:
    print("Not String");

1

Giriş verilerinin biçim dizesi veya unicode olduğundan emin olmak için isinstance işlevini kullanabilirsiniz . Aşağıdaki örnekler kolayca anlamanıza yardımcı olacaktır.

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True


-6

Bunu nasıl yaparım:

if type(x) == type(str()):

4
type(str())çok dolambaçlı bir söylem şeklidir str. Türler tek tonludur, bu type(x) is strnedenle daha verimlidir. isinstance()alt sınıflarını yoksaymak için çok iyi nedenleriniz olmadıkça bunun yerine kullanılmalıdır str.
Martijn Pieters

(x) türü str ise:
shaurya uppal


-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True

2
Bu durumda tercih ediyorum type(thing).__name__ == 'str'üzerinde type(thing) == strveya isinstance(thing, str)? Ayrıca unicodePython'un modern versiyonlarında mevcut değildir.
vaultah
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.