正确的方法来断言Python中的variablestypes

在使用一个函数时,我希望确保variables的types符合预期。 如何做到这一点?

下面是一个伪装函数的例子,在继续它的angular色之前试图做到这一点:

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() 

坚持正确的做法? 我应该使用try / except来代替吗?

另外,我断言一组testing似乎不能正常工作:S

感谢pythoneers

如果你真的需要,内置isinstance是首选的方法,但更好的是要记住Python的座右铭:“请求宽恕比允许更容易” – )(这实际上是Grace Murray Hopper最喜欢的座右铭;-)。 即:

 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') 

顺便说一下,这个函数可以让函数在Unicodestring上正常工作 – 不需要额外的工作!)

你可能想要为Python 2.6版本尝试这个例子。

 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() + begin.upper() + end.lower() 

不过,你有没有考虑让函数自然失效呢?

type('')实际上等同于strtypes.StringType

所以type('') == str == types.StringType将评估为“ True

请注意,如果以这种方式检查types,那么只包含ASCII的Unicodestring将会失败,因此您可能需要assert type(s) in (str, unicode)assert isinstance(obj, basestring) assert type(s) in (str, unicode) assert isinstance(obj, basestring) ,后者是build议在007Brendan的意见,可能是首选。

isinstance()是有用的,如果你想问一个对象是否是一个类的实例,例如:

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

但对于基本的types,例如strunicodeintfloatlong等,要求type(var) == TYPE将工作正常。