Proper way to assert type of variable in Python

后端 未结 3 1150
遇见更好的自我
遇见更好的自我 2021-01-31 01:13

In using a function, I wish to ensure that the type of the variables are as expected. How to do it right?

Here is an example fake function trying to do just this before

相关标签:
3条回答
  • 2021-01-31 01:46

    You might want to try this example for version 2.6 of Python.

    def my_print(text, begin, end):
        "Print text in UPPER between 'begin' and 'end' in lower."
        for obj in (text, begin, end):
            assert isinstance(obj, str), 'Argument of wrong type!'
        print begin.lower() + text.upper() + end.lower()
    

    However, have you considered letting the function fail naturally instead?

    0 讨论(0)
  • 2021-01-31 01:57

    Doing type('') is effectively equivalent to str and types.StringType

    so type('') == str == types.StringType will evaluate to "True"

    Note that Unicode strings which only contain ASCII will fail if checking types in this way, so you may want to do something like assert type(s) in (str, unicode) or assert isinstance(obj, basestring), the latter of which was suggested in the comments by 007Brendan and is probably preferred.

    isinstance() is useful if you want to ask whether an object is an instance of a class, e.g:

    class MyClass: pass
    
    print isinstance(MyClass(), MyClass) # -> True
    print isinstance(MyClass, MyClass()) # -> TypeError exception
    

    But for basic types, e.g. str, unicode, int, float, long etc asking type(var) == TYPE will work OK.

    0 讨论(0)
  • 2021-01-31 02:03

    The isinstance built-in is the preferred way if you really must, but even better is to remember Python's motto: "it's easier to ask forgiveness than permission"!-) (It was actually Grace Murray Hopper's favorite motto;-). I.e.:

    def my_print(text, begin, end):
        "Print 'text' in UPPER between 'begin' and 'end' in lower"
        try:
          print begin.lower() + text.upper() + end.lower()
        except (AttributeError, TypeError):
          raise AssertionError('Input variables should be strings')
    

    This, BTW, lets the function work just fine on Unicode strings -- without any extra effort!-)

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