Search code examples
pythontestingassert

Proper way to assert type of variable in Python


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 going on with its role:

def my_print(begin, text, end):
    """Print 'text' in UPPER between 'begin' and 'end' in lower

    """
    for i in (begin, text, end):
        assert isinstance(i, str), "Input variables should be strings"
    out = begin.lower() + text.upper() + end.lower()
    print out

def test():
    """Put your test cases here!

    """
    assert my_print("asdf", "fssfpoie", "fsodf")
    assert not my_print("fasdf", 33, "adfas")
    print "All tests passed"

test()

Is assert the right approach? Should I use try/except instead?

Also, my assert set of tests does not seem to work properly :S

Thanks pythoneers


Solution

  • 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!-)