在Python中断言变量类型的正确方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中断言变量类型的正确方法相关的知识,希望对你有一定的参考价值。
使用函数时,我希望确保变量的类型符合预期。如何正确执行?
这是一个伪函数示例,尝试在继续其作用之前执行此操作:
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吗?
而且,我断言的一组测试似乎无法正常工作:S
感谢pythoneers
isinstance
内置是您真正必须的首选方式,但是更好的是记住Python的座右铭:“宽恕比许可要容易得多!!-)(实际上是Grace Murray Hopper最喜欢的座右铭;- )。即:
isinstance
顺便说一句,顺便说一句,该函数可以在Unicode字符串上正常工作-无需任何额外的工作!-)
您可能想为2.6版的Python尝试此示例。
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')
但是,您是否考虑过让函数自然失败?
执行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()
实际上等效于type('')
和str
所以types.StringType
将计算为“ type('') == str == types.StringType
”]
[请注意,如果仅通过这种方式检查类型,则仅包含ASCII的Unicode字符串将失败,因此您可能需要执行True
或assert type(s) in (str, unicode)
之类的操作,其中的后者由007Brendan在注释中建议,可能是首选。
[assert isinstance(obj, basestring)
很有用,如果您想问一个对象是否是一个类的实例,例如:
isinstance()
但是对于基本类型,例如询问class MyClass: pass
print isinstance(MyClass(), MyClass) # -> True
print isinstance(MyClass, MyClass()) # -> TypeError exception
的str
,unicode
,int
,float
,long
等将可以正常工作。
以上是关于在Python中断言变量类型的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
Swift入门——可选类型(Optionals)与断言(Assert)