Làm thế nào để kiểm tra xem loại của một biến là chuỗi?


766

Có cách nào để kiểm tra xem loại biến trong python có phải là một không string, như:

isinstance(x,int);

cho giá trị nguyên?


11
Yêu cầu đọc trên isinstance nếu bạn đang học python canonical.org/~kragen/isinstance .
cá voi


Hãy cẩn thận với ints kể từ đó isinstance(True, int) is True.
Albert Tugushev

isinstance(x,str)là chính xác trong Python 3 (str là một loại cơ bản).
MasterControl

Câu trả lời:


1139

Trong Python 2.x, bạn sẽ làm

isinstance(s, basestring)

basestringsiêu lớp trừu tượng của strunicode. Nó có thể được sử dụng để kiểm tra xem một đối tượng là một thể hiện của strhay unicode.


Trong Python 3.x, bài kiểm tra đúng là

isinstance(s, str)

Các byteslớp học không được coi là một loại chuỗi bằng Python 3.


10
@Yarin: Không. Nhưng không sao, vì Python 3.x hoàn toàn không tương thích với Python 2.x.
netcoder

2
Tôi thấy rằng isinstance (s, str) hoạt động với py27, đã được thử nghiệm trên: Python 2.7.5 (mặc định, ngày 25 tháng 8 năm 2013, 00:04:04) [GCC 4.2.1 Tương thích Apple LLVM 5.0 (clang-500.0.68)] trên darwin.
kakyo

25
@kakyo: Vấn đề là nó sẽ bỏ lỡ unicodecác đối tượng, cũng nên được coi là chuỗi. Cả loại strvà loại unicodeđều có lớp cơ sở chung basestringvà đây là thứ bạn muốn kiểm tra.
Sven Marnach

7
@Yarin nếu bạn chuyển một cái gì đó từ 2.x đến 3.x, bạn luôn có thể gán basestring = str.
Jack

9
@AdamErickson Để tương thích với chính xác những gì? Nó không giúp tương thích với Python 3, vì không có unicodePython 3. Khuyến cáo của tôi về khả năng tương thích giữa Python 2 và 3 là sử dụng thư viện "sáu". (Cụ thể isintance(s, six.string_types)trong trường hợp này)
Sven Marnach

222

Tôi biết đây là một chủ đề cũ, nhưng là chủ đề đầu tiên được hiển thị trên google và được cho rằng tôi không tìm thấy bất kỳ câu trả lời nào thỏa đáng, tôi sẽ để lại đây để tham khảo trong tương lai:

sáu là một thư viện tương thích Python 2 và 3 đã bao gồm vấn đề này. Sau đó bạn có thể làm một cái gì đó như thế này:

import six

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

Kiểm tra mã, đây là những gì bạn tìm thấy:

import sys

PY3 = sys.version_info[0] == 3

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

4
Ví dụ: đối với một lớp lót : value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring), trong đó >=giả sử bất kỳ Python 4+ cuối cùng nào giữ strlớp gốc cho chuỗi.
Pi Marillion

64

Trong Python 3.x hoặc Python 2.7.6

if type(x) == str:

10
Tôi thích sự thanh lịch của "if type (x) in (str, unicode):", nhưng tôi thấy cờ PyLint là "không phổ biến".
eukras

15
Việc so sánh các loại với ==PEP8 không được khuyến khích rõ ràng và có một số nhược điểm ngoài việc được coi là "không phổ biến", ví dụ như nó không phát hiện các trường hợp của các lớp con str, cũng nên được coi là các chuỗi. Nếu bạn thực sự muốn kiểm tra chính xác loại strvà loại trừ rõ ràng các lớp con, hãy sử dụng type(x) is str.
Sven Marnach

17

bạn có thể làm:

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

hoặc là:

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

hi vọng điêu nay co ich!



11

Chỉnh sửa dựa trên câu trả lời tốt hơn dưới đây. Đi xuống khoảng 3 câu trả lời và tìm hiểu về sự mát mẻ của basestring.

Câu trả lời cũ: Coi chừng các chuỗi unicode mà bạn có thể nhận được từ một số nơi, bao gồm tất cả các cuộc gọi COM trong Windows.

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

1
Nắm bắt tốt. Tôi không biết về basestring. Nó đã đề cập đến khoảng 3 bài viết và có vẻ như là một câu trả lời tốt hơn.
Wade Hatler

6
isinstance()cũng lấy một tuple làm đối số thứ hai. Vì vậy, ngay cả khi basestringkhông tồn tại, bạn chỉ có thể sử dụng isinstance(target, (str, unicode)).
Martijn Pieters

3
Trong python 3.5.1, unicodedường như không được xác định:NameError: name 'unicode' is not defined
Eric Hu

11

do basestringkhông được định nghĩa trong Python3, mẹo nhỏ này có thể giúp làm cho mã tương thích:

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

sau đó bạn có thể chạy thử nghiệm sau trên cả Python2 và Python3

isinstance(myvar, basestring)

4
Hoặc nếu bạn cũng muốn bắt các chuỗi byte:basestring = (str, bytes)
Mark Ransom

10

Python 2/3 bao gồm cả unicode

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
Cảm ơn rất nhiều! Có hàng tá câu trả lời khác nhau trên internet nhưng điều tốt nhất là câu trả lời này. Dòng đầu tiên type('foo')được unicodemặc định trong python 2 và dòng thứ hai strlà phiên bản của unicode. Thoses làm cho mã hợp lệ trong Python 2 và 3. Cảm ơn một lần nữa!
Narann

9

Ngoài ra tôi muốn lưu ý rằng nếu bạn muốn kiểm tra xem loại biến có phải là một loại cụ thể hay không, bạn có thể so sánh loại biến với loại của một đối tượng đã biết.

Đối với chuỗi bạn có thể sử dụng này

type(s) == type('')

7
Đây là một cách khủng khiếp, khủng khiếp để gõ kiểm tra trăn. Điều gì nếu một lớp khác kế thừa từ str? Điều gì về chuỗi unicode, thậm chí không kế thừa từ strtrong 2.x? Sử dụng isinstance(s, basestring)trong 2.x hoặc isinstance(s, str)trong 3.x.
Jack

1
@Jack, vui lòng đọc câu hỏi và cũng lưu ý rằng tôi không viết rằng đó là cách tốt nhất, chỉ là một cách khác.
Daniil Grankin

9
Đây là một ý tưởng tồi vì 3 lý do: isinstance()cho phép các lớp con (cũng là chuỗi, chỉ chuyên biệt), type('')cuộc gọi thêm là dư thừa khi bạn chỉ có thể sử dụng strvà các loại là singletons, vì vậy type(s) is strsẽ là một thử nghiệm hiệu quả hơn.
Martijn Pieters

8

Rất nhiều đề xuất tốt được cung cấp bởi những người khác ở đây, nhưng tôi không thấy một bản tóm tắt đa nền tảng tốt. Sau đây nên là một sự lựa chọn tốt cho bất kỳ chương trình Python nào:

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)

Trong hàm này, chúng tôi sử dụng isinstance(object, classinfo)để xem liệu đầu vào của chúng tôi là strtrong Python 3 hay basestringtrong Python 2.


1
Điều này có thể sẽ phá vỡ trong Python 4, xem xét >=ít nhất.
thakis

2
sạch hơn để kiểm tra six.opes_types hoặc six.text_type
daonb

@daonb nhập toàn bộ một mô-đun chỉ để thực hiện kiểm tra một dòng là suy nghĩ gây ra các cây phụ thuộc điên rồ và phình to nghiêm trọng để phá hỏng những gì nên là một cái gì đó nhỏ và đơn giản. Tất nhiên đó là cuộc gọi của bạn, nhưng chỉ cần nói ...
duanev

@duanev nếu bạn lo lắng về khả năng tương thích Python 2/3, tốt hơn hết là bạn nên sử dụng sáu trong bất kỳ dự án nào. Six cũng là một tập tin duy nhất nên cây / bloat phụ thuộc không phải là vấn đề ở đây.
MoxieBall

7

Cách khác cho Python 2, không sử dụng basestring:

isinstance(s, (str, unicode))

Nhưng vẫn không hoạt động trong Python 3 vì unicodekhông được xác định (trong Python 3).


7

Vì thế,

Bạn có nhiều tùy chọn để kiểm tra xem biến của bạn có phải là chuỗi hay không:

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

Thứ tự này là dành cho mục đích.


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

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

trả về True

type(a) in [str, unicode]

trả về True


Đối với Python 2.7.12, tôi đã phải xóa các dấu ngoặc kép: gõ (a) trong [str, unicode]
Adam Erickson

4

Đây là câu trả lời của tôi để hỗ trợ cả Python 2 và Python 3 cùng với các yêu cầu sau:

  • Được viết bằng mã Py3 với mã compat tối thiểu Py2.
  • Loại bỏ mã compat Py2 sau mà không bị gián đoạn. Tức là chỉ nhằm mục đích xóa, không sửa đổi mã Py3.
  • Tránh sử dụng sixhoặc mô-đun compat tương tự vì chúng có xu hướng che giấu những gì đang cố gắng đạt được.
  • Bằng chứng trong tương lai cho một Py4 tiềm năng.

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

Nếu bạn không muốn phụ thuộc vào lib bên ngoài, điều này hoạt động cả cho Python 2.7+ và Python 3 ( 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

Bạn chỉ có thể sử dụng hàm isinstance để đảm bảo rằng dữ liệu đầu vào là chuỗi định dạng hoặc unicode . Ví dụ dưới đây sẽ giúp bạn dễ hiểu.

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


-6

Đây là cách tôi làm điều đó:

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

4
type(str())là một cách nói rất vòng vo str. Các loại là singletons, vì vậy type(x) is strlà hiệu quả hơn. isinstance()nên được sử dụng thay thế, trừ khi bạn có lý do rất chính đáng để bỏ qua các lớp con của str.
Martijn Pieters

nếu loại (x) là str:
shaurya uppal


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

2
Trong trường hợp nào bạn thích type(thing).__name__ == 'str'hơn type(thing) == strhoặc isinstance(thing, str)? Cũng unicodekhông tồn tại trong các phiên bản hiện đại của Python.
vaultah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.