Надлежащий способ утверждать тип переменной в 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()

Утверждают правильный подход? Я должен использовать попытку/кроме вместо этого?

Кроме того, мой утверждать набор тестов, кажется, не работает правильно :S

Спасибо pythoneers

57
задан Morlock 7 April 2010 в 02:08
поделиться

3 ответа

Встроенный 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 - без каких-либо дополнительных усилий! -)

52
ответ дан 24 November 2019 в 19:44
поделиться

Выполнение 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) == ТИП будет работать нормально.

7
ответ дан 24 November 2019 в 19:44
поделиться

Вы можете попробовать этот пример для версии 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()

Однако не думали ли вы о том, чтобы вместо этого позволить функции выполнить естественный сбой?

12
ответ дан 24 November 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: