Подтвердить что ты не робот

Правильный способ утверждения типа переменной в 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

4b9b3361

Ответ 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 будет работать нормально.