จะตรวจสอบว่าตัวแปรประเภทใดเป็นสตริงได้หรือไม่


766

มีวิธีการตรวจสอบว่าประเภทของตัวแปรในหลามเป็นstringเช่น:

isinstance(x,int);

สำหรับค่าจำนวนเต็ม?


11
จำเป็นต้องอ่านบน isinstance ถ้าคุณกำลังเรียนรู้หลามcanonical.org/~kragen/isinstance
whaley


ระมัดระวังกับ ints isinstance(True, int) is Trueตั้งแต่
Albert Tugushev

isinstance(x,str)ถูกต้องใน Python 3 (str เป็นชนิดพื้นฐาน)
MasterControlProgram

คำตอบ:


1138

ใน Python 2.x คุณต้องทำ

isinstance(s, basestring)

basestringเป็นsuperclass นามธรรมของและstr unicodeมันสามารถใช้ในการทดสอบว่าวัตถุเป็นตัวอย่างของหรือstrunicode


ใน Python 3.x การทดสอบที่ถูกต้องคือ

isinstance(s, str)

bytesชั้นจะไม่ถือว่าเป็นประเภทสตริงในหลาม 3


10
@Yarin: ไม่ แต่มันไม่สำคัญเพราะ Python 3.x ไม่ได้หมายความว่าจะเข้ากันได้กับ Python 2.x เลย
netcoder

2
ฉันพบว่า isinstance (s, str) ทำงานกับ py27 ทดสอบบน: Python 2.7.5 (ค่าเริ่มต้น, 25 ส.ค. 2013, 00:04:04) [GCC 4.2.1 แอปเปิ้ลที่รองรับ LLVM 5.0 (clang-500.0.68)] บนดาร์วิน
kakyo

25
@kakyo: ปัญหาคือว่ามันจะพลาดunicodeวัตถุซึ่งควรพิจารณาสตริง ทั้งประเภทstrและประเภทunicodeมีคลาสพื้นฐานร่วมกันbasestringและนี่คือสิ่งที่คุณต้องการตรวจสอบ
Sven Marnach

7
@Yarin ถ้าคุณกำลัง porting อะไรบางอย่างจากการ 2.x 3.x basestring = strคุณสามารถกำหนดเสมอ
แจ็ค

9
@AdamErickson เข้ากันได้กับสิ่งที่ว่า? มันไม่ช่วยให้เข้ากันได้กับ Python 3 เนื่องจากไม่มีunicodeใน Python 3 คำแนะนำของฉันสำหรับความเข้ากันได้ระหว่าง Python 2 และ 3 คือการใช้ไลบรารี่ "หก" (โดยเฉพาะisintance(s, six.string_types)ในกรณีนี้)
Sven Marnach

222

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่เป็นคนแรกที่ปรากฏบน Google และระบุว่าฉันไม่พบคำตอบที่น่าพอใจฉันจะปล่อยไว้ที่นี่เพื่ออ้างอิงในอนาคต:

sixคือไลบรารีความเข้ากันได้ของ Python 2 และ 3 ซึ่งครอบคลุมปัญหานี้อยู่แล้ว จากนั้นคุณสามารถทำสิ่งนี้:

import six

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

ตรวจสอบรหัสนี่คือสิ่งที่คุณพบ:

import sys

PY3 = sys.version_info[0] == 3

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

4
เช่นสำหรับซับเดียว: value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)โดย>=สมมติว่า Python 4+ ใด ๆ จะเก็บstrคลาสรูทของสตริงไว้
Pi Marillion

63

ใน Python 3.x หรือ Python 2.7.6

if type(x) == str:

10
ฉันชอบความสง่างามของ "if type (x) ใน (str, unicode):" แต่ฉันเห็น PyLint ตั้งค่าสถานะเป็น "unidiomatic"
eukras

15
การเปรียบเทียบประเภทที่มีการ==กีดกันอย่างชัดเจนโดย PEP8 และมีข้อเสียหลายประการที่นอกเหนือจากการพิจารณา "unidiomatic" เช่นไม่ตรวจพบอินสแตนซ์ของ subclasses ของstrซึ่งควรพิจารณาเป็นสตริงเช่นกัน ถ้าคุณอยากจะตรวจสอบว่าชนิดstrและชัดเจนยกเว้น subclasses type(x) is strใช้
Sven Marnach

17

คุณทำได้:

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

หรือ:

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

หวังว่านี่จะช่วยได้!



11

แก้ไขตามคำตอบที่ดีกว่าด้านล่าง ลงไปประมาณ 3 คำตอบและค้นหาเกี่ยวกับความเจ๋งของ basestring

คำตอบเก่า: ระวังสตริง Unicode ซึ่งคุณสามารถรับได้จากหลายที่รวมถึงการโทร COM ทั้งหมดใน Windows

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

1
จับดี. ฉันไม่รู้เกี่ยวกับ basestring มันถูกกล่าวถึงประมาณ 3 โพสต์ลงและดูเหมือนว่าเป็นคำตอบที่ดีกว่า
ลุย Hatler

6
isinstance()ยังใช้สิ่งอันดับเป็นอาร์กิวเมนต์ที่สอง ดังนั้นแม้ว่าไม่ได้อยู่ที่คุณก็สามารถใช้basestring isinstance(target, (str, unicode))
Martijn Pieters

3
ใน python 3.5.1 unicodeดูเหมือนจะไม่ถูกกำหนด:NameError: name 'unicode' is not defined
Eric Hu

11

เนื่องจากbasestringไม่ได้กำหนดไว้ใน Python3 เคล็ดลับเล็กน้อยนี้อาจช่วยให้รหัสเข้ากันได้:

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

หลังจากนั้นคุณสามารถรันการทดสอบต่อไปนี้ได้ทั้ง Python2 และ Python3

isinstance(myvar, basestring)

4
หรือถ้าคุณต้องการที่จะจับสตริงไบต์ด้วย:basestring = (str, bytes)
ทำเครื่องหมายว่าค่าไถ่

10

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
ขอบคุณมาก! มีคำตอบต่าง ๆ มากมายในอินเทอร์เน็ต แต่สิ่งเดียวที่ดีคือคำตอบนี้ บรรทัดแรกทำให้type('foo')เป็นunicodeโดยเริ่มต้นในหลาม 2 และคนที่สองให้เป็นตัวอย่างของstr unicodeสิ่งที่ทำให้รหัสถูกต้องใน Python 2 และ 3 ขอบคุณอีกครั้ง!
Narann

9

นอกจากนี้ฉันต้องการแจ้งให้ทราบว่าถ้าคุณต้องการตรวจสอบว่าชนิดของตัวแปรเป็นชนิดเฉพาะคุณสามารถเปรียบเทียบประเภทของตัวแปรกับประเภทของวัตถุที่รู้จัก

สำหรับสตริงคุณสามารถใช้สิ่งนี้

type(s) == type('')

7
นี่เป็นวิธีที่น่ากลัวและแย่มากในการพิมพ์เช็คอินไพ ธ อน เกิดอะไรขึ้นถ้าอีกสืบทอดชั้นจากstr? สิ่งที่เกี่ยวกับสตริง Unicode ซึ่งไม่ได้รับสืบทอดมาจากstrใน 2.x? ใช้isinstance(s, basestring)ใน 2.x หรือisinstance(s, str)3.x
แจ็ค

1
@ แจ็คโปรดอ่านคำถามและสังเกตว่าฉันไม่ได้เขียนว่ามันเป็นวิธีที่ดีที่สุดอีกวิธีหนึ่ง
Daniil Grankin

9
นี่เป็นความคิดที่ไม่ดีด้วยเหตุผล 3 ประการ: isinstance()อนุญาตสำหรับคลาสย่อย (ซึ่งเป็นสตริงด้วย, โดยเฉพาะ), การtype('')โทรพิเศษนั้นซ้ำซ้อนเมื่อคุณสามารถใช้งานได้strและประเภทคือซิงเกิลดังนั้นtype(s) is strจะเป็นการทดสอบที่มีประสิทธิภาพมากขึ้น
Martijn Pieters

8

คำแนะนำที่ดีมากมายจากผู้อื่นที่นี่ แต่ฉันไม่เห็นข้อมูลสรุปข้ามแพลตฟอร์มที่ดี ต่อไปนี้ควรเป็นโปรแกรมหล่นที่ดีสำหรับโปรแกรม Python:

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)

ในฟังก์ชั่นนี้เราใช้isinstance(object, classinfo)เพื่อดูว่าอินพุตของเราเป็นแบบstrPython 3 หรือ a basestringใน Python 2


1
สิ่งนี้น่าจะทำลายใน Python 4 พิจารณา>=อย่างน้อย
thakis

2
ทำความสะอาดเพื่อตรวจหา six.string_types หรือ six.text_type
daonb

@daonb นำเข้าโมดูลทั้งหมดเพียงเพื่อทำการทดสอบหนึ่งบรรทัดคือความคิดที่ทำให้ต้นไม้พึ่งพาบ้าและขยายตัวอย่างรุนแรงเพื่อทำลายสิ่งที่ควรเป็นสิ่งที่สั้นและเรียบง่าย แน่นอนว่ามันเป็นสายของคุณ แต่เพียงแค่พูดว่า '...
duanev

@duanev หากคุณกังวลเกี่ยวกับความเข้ากันได้ของ Python 2/3 เป็นความคิดที่ดีกว่าถ้าใช้หกตัวในโครงการ หกยังเป็นไฟล์เดียวดังนั้นต้นไม้ที่พึ่งพาได้ / การขยายตัวไม่ใช่ปัญหาที่นี่
MoxieBall

7

ทางเลือกอื่นสำหรับ Python 2 โดยไม่ต้องใช้ basestring:

isinstance(s, (str, unicode))

แต่ก็ยังใช้งานไม่ได้ใน Python 3 เนื่องจากunicodeไม่ได้กำหนดไว้ (ใน Python 3)


7

ดังนั้น,

คุณมีตัวเลือกมากมายในการตรวจสอบว่าตัวแปรของคุณเป็นสตริงหรือไม่:

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

คำสั่งนี้มีวัตถุประสงค์เพื่อ


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

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

ส่งคืน True

type(a) in [str, unicode]

ส่งคืน True


สำหรับ Python 2.7.12 ฉันต้องลบเครื่องหมายคำพูด: type (a) ใน [str, unicode]
Adam Erickson

4

นี่คือคำตอบของฉันที่จะสนับสนุนทั้ง Python 2 และ Python 3 พร้อมกับข้อกำหนดเหล่านี้:

  • เขียนในรหัส Py3 ด้วยรหัส Py2 ที่น้อยที่สุด
  • ลบ Py2 compat code ในภายหลังโดยไม่หยุดชะงัก เช่นมีวัตถุประสงค์เพื่อลบเท่านั้นไม่มีการแก้ไขโค้ด Py3
  • หลีกเลี่ยงการใช้sixหรือโมดูลที่คล้ายกันเนื่องจากพวกเขามักจะซ่อนสิ่งที่พยายามจะทำได้
  • พิสูจน์อนาคตสำหรับ Py4 ที่มีศักยภาพ

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

หากคุณไม่ต้องการพึ่ง libs ภายนอกสิ่งนี้ใช้ได้ทั้ง Python 2.7+ และ 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

คุณก็สามารถใช้isinstanceฟังก์ชั่นเพื่อให้แน่ใจว่าข้อมูลของท่านเป็นรูปแบบสตริงหรือUnicode ตัวอย่างด้านล่างจะช่วยให้คุณเข้าใจได้ง่ายขึ้น

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


-6

นี่คือวิธีที่ฉันทำ:

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

4
type(str())strเป็นวิธีที่วงเวียนมากพูดว่า ประเภทคือซิงเกิลจึงtype(x) is strมีประสิทธิภาพมากกว่า isinstance()ควรจะนำมาใช้แทนเว้นแต่คุณจะมีเหตุผลที่ดีมากที่จะไม่สนใจ subclasses strของ
Martijn Pieters

ถ้า type (x) คือ str:
shaurya uppal


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

2
ในกรณีใดที่คุณต้องการtype(thing).__name__ == 'str'มากกว่าtype(thing) == strหรือisinstance(thing, str)? นอกจากนี้ยังunicodeไม่อยู่ในรุ่นที่ทันสมัยของงูใหญ่
vaultah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.