How to compare type of an object in Python?

后端 未结 14 2362
闹比i
闹比i 2020-11-28 01:26

Basically I want to do this:

obj = \'str\'
type ( obj ) == string

I tried:

type ( obj ) == type ( string )
<
相关标签:
14条回答
  • 2020-11-28 02:00

    Use str instead of string

    type ( obj ) == str
    

    Explanation

    >>> a = "Hello"
    >>> type(a)==str
    True
    >>> type(a)
    <type 'str'>
    >>>
    
    0 讨论(0)
  • 2020-11-28 02:00

    You can compare classes for check level.

    #!/usr/bin/env python
    #coding:utf8
    
    class A(object):
        def t(self):
            print 'A'
        def r(self):
            print 'rA',
            self.t()
    
    class B(A):
        def t(self):
            print 'B'
    
    class C(A):
        def t(self):
            print 'C'
    
    class D(B, C):
        def t(self):
            print 'D',
            super(D, self).t()
    
    class E(C, B):
        pass
    
    d = D()
    d.t()
    d.r()
    
    e = E()
    e.t()
    e.r()
    
    print isinstance(e, D) # False
    print isinstance(e, E) # True
    print isinstance(e, C) # True
    print isinstance(e, B) # True
    print isinstance(e, (A,)) # True
    print e.__class__ >= A, #False
    print e.__class__ <= C, #False
    print e.__class__ <  E, #False
    print e.__class__ <= E  #True
    
    0 讨论(0)
  • 2020-11-28 02:03

    To get the type, use the __class__ member, as in unknown_thing.__class__

    Talk of duck-typing is useless here because it doesn't answer a perfectly good question. In my application code I never need to know the type of something, but it's still useful to have a way to learn an object's type. Sometimes I need to get the actual class to validate a unit test. Duck typing gets in the way there because all possible objects have the same API, but only one is correct. Also, sometimes I'm maintaining somebody else's code, and I have no idea what kind of object I've been passed. This is my biggest problem with dynamically typed languages like Python. Version 1 is very easy and quick to develop. Version 2 is a pain in the buns, especially if you didn't write version 1. So sometimes, when I'm working with a function I didn't write, I need to know the type of a parameter, just so I know what methods I can call on it.

    That's where the __class__ parameter comes in handy. That (as far as I can tell) is the best way (maybe the only way) to get an object's type.

    0 讨论(0)
  • 2020-11-28 02:05
    isinstance()
    

    In your case, isinstance("this is a string", str) will return True.

    You may also want to read this: http://www.canonical.org/~kragen/isinstance/

    0 讨论(0)
  • 2020-11-28 02:07

    Type doesn't work on certain classes. If you're not sure of the object's type use the __class__ method, as so:

    >>>obj = 'a string'
    >>>obj.__class__ == str
    True
    

    Also see this article - http://www.siafoo.net/article/56

    0 讨论(0)
  • 2020-11-28 02:13

    You can always use the type(x) == type(y) trick, where y is something with known type.

    # check if x is a regular string
    type(x) == type('')
    # check if x is an integer
    type(x) == type(1)
    # check if x is a NoneType
    type(x) == type(None)
    

    Often there are better ways of doing that, particularly with any recent python. But if you only want to remember one thing, you can remember that.

    In this case, the better ways would be:

    # check if x is a regular string
    type(x) == str
    # check if x is either a regular string or a unicode string
    type(x) in [str, unicode]
    # alternatively:
    isinstance(x, basestring)
    # check if x is an integer
    type(x) == int
    # check if x is a NoneType
    x is None
    

    Note the last case: there is only one instance of NoneType in python, and that is None. You'll see NoneType a lot in exceptions (TypeError: 'NoneType' object is unsubscriptable -- happens to me all the time..) but you'll hardly ever need to refer to it in code.

    Finally, as fengshaun points out, type checking in python is not always a good idea. It's more pythonic to just use the value as though it is the type you expect, and catch (or allow to propagate) exceptions that result from it.

    0 讨论(0)
提交回复
热议问题