В использовании функции я хочу удостовериться, что тип переменных как ожидалось. Как сделать это правильный?
Вот функция фальшивки в качестве примера, пытающаяся сделать просто это перед продолжением ее роли:
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()
Утверждают правильный подход? Я должен использовать попытку/кроме вместо этого?
Кроме того, мой утверждать набор тестов, кажется, не работает правильно :S
Спасибо pythoneers
Встроенный isinstance
- предпочтительный способ, если вам действительно нужно, но еще лучше помнить девиз 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')
Это, кстати, позволяет функции отлично работать со строками Unicode - без каких-либо дополнительных усилий! -)
Выполнение type ('')
фактически эквивалентно str
и types.StringType
, поэтому type ('') == str == types.StringType
будет оцениваться как « True
»
Обратите внимание, что строки Unicode, которые содержат только ASCII, не смогут выполнить проверку типов таким способом, поэтому вы можете сделать что-то вроде assert тип (ы) в (str, unicode)
или assert isinstance (obj, basestring)
, последний из которых был предложен в комментариях 007Brendan и, вероятно, предпочтительнее.
isinstance ()
полезен, если вы хотите спросить, является ли объект экземпляром класса, например:
class MyClass: pass
print isinstance(MyClass(), MyClass) # -> True
print isinstance(MyClass, MyClass()) # -> TypeError exception
Но для базовых типов, например str
, unicode
, int
, float
, long
и т. Д. С запросом type (var) == ТИП
будет работать нормально.
Вы можете попробовать этот пример для версии 2.6 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() + begin.upper() + end.lower()
Однако не думали ли вы о том, чтобы вместо этого позволить функции выполнить естественный сбой?