Правильный способ утверждения типа переменной в 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
Ответы
Ответ 1
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')
Это, BTW, позволяет функции работать отлично в строках Unicode - без каких-либо дополнительных усилий! -)
Ответ 2
Возможно, вы захотите попробовать этот пример для версии 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()
Однако, вы считали, что вместо этого функция отказывается естественным образом?
Ответ 3
Выполнение type('')
эффективно эквивалентно str
и types.StringType
поэтому type('') == str == types.StringType
будет оценивать значение "True
"
Обратите внимание, что строки Unicode, содержащие только ASCII, будут сбой при проверке типов таким образом, поэтому вы можете сделать что-то вроде assert type(s) in (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) == TYPE
будет работать нормально.