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?
isinstance(True, int) is True.
isinstance(x,str)là chính xác trong Python 3 (str là một loại cơ bản).
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?
isinstance(True, int) is True.
isinstance(x,str)là chính xác trong Python 3 (str là một loại cơ bản).
Câu trả lời:
Trong Python 2.x, bạn sẽ làm
isinstance(s, basestring)
basestringlà siêu lớp trừu tượng của strvà unicode. 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.
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.
basestring = str.
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)
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,
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.
Trong Python 3.x hoặc Python 2.7.6
if type(x) == str:
==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.
Mô-đun loại cũng tồn tại nếu bạn đang kiểm tra nhiều hơn ints và chuỗi. http://docs.python.org/l Library / type.html
types.StringTypes.
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):
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)).
unicodedường như không được xác định:NameError: name 'unicode' is not defined
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)
basestring = (str, bytes)
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
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!
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('')
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.
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.
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.
>=ít nhất.
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
Đâ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:
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.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)
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");
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
s = '123'
issubclass(s.__class__, str)
Đây là cách tôi làm điều đó:
if type(x) == type(str()):
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.
Tôi đã thấy:
hasattr(s, 'endswith')
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
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.