正确的方法来断言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('')
实际上等同于str
和types.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,例如str
, unicode
, int
, float
, long
等,要求type(var) == TYPE
将工作正常。