Как указать тип аргумента в динамически типизированном языке, то есть Python? - PullRequest
1 голос
/ 20 сентября 2010

Есть ли такой эквивалент Java

String myMethod (MyClass argument) {...}

в Python?

Спасибо, Томас

Ответы [ 5 ]

13 голосов
/ 20 сентября 2010

Нет.(И еще, чтобы округлить до 15 символов ...)

12 голосов
/ 20 сентября 2010

Нет, нет.

На самом деле, проверка типов считается "непифонической", потому что объект любого типа, который выглядит достаточно похожим на ожидаемый тип, должен обрабатываться одинаково.

8 голосов
/ 21 сентября 2010

Python 3.x имеет аннотации функций, в которых вы можете объявлять аргументы и возвращаемые типы:

def myMethod(argument: MyClass) -> str:
   ...

Но в настоящее время Python ничего с ними не делает, они служат только документацией.

4 голосов
/ 21 сентября 2010

Я просто хочу сказать, что полностью согласен с тем, что проверка типов - это зло. Но питон также невероятно гибок, и я настроен быть злым. Этот код вступит в силу во время выполнения, а не во время компиляции. Вы можете сделать что-то подобное для возвращаемого типа. Нечто подобное может быть полезно для отладки, и, поскольку это декоратор, его достаточно легко удалить.

Чтобы он был полезен для отладки, вам необходимо иметь ситуацию, когда два типа имеют одинаковые атрибуты, к которым обращались, но с разной семантикой. Так что это довольно ограниченный случай. Кроме этого, вы все равно получите опечатку при запуске этого кода. Хорошей новостью является то, что это почти никогда не проблема . Я действительно не знаю, почему люди со статически типизированными языками делают из этого такое большое дело.

def types(*args, **kwargs):
    arg_types = args
    kwarg_types = kwargs
    def decorator(f):
        def func(*args, **kwargs):
            for arg, arg_type in zip(args, arg_types):
                if not isinstance(arg, arg_type):
                    raise TypeError("Wrong type suckah")
            for kw, arg in kwargs.items():
                if not isinstance(arg, kwarg_types[kw]):
                    raise TypeError("this is a bad error message")
            return f(*args, **kwargs)
        return func
    return decorator

@types(int, str, bool, flag=bool)
def demo(i, strng, flag=False):
    print i, strng, flag

demo(1, "foo", True)

try:
    demo("foo", "bar", flag="foobar")
except TypeError:
    print "busted on posargs"

try:
    demo(1, "foo", flag=2)
except TypeError:
    print "busted on keyargs"

try:
    demo(1, "foo", 3)
except TypeError:
    print "no use sneaking it through"
1 голос
/ 20 сентября 2010

Нет.

В Python это программа ответственность за использование встроенного функции, такие как isinstance () и issubclass () для проверки типов переменных и правильное использование. Python пытается держись подальше, давая тебе все что вам нужно для реализации сильного типа проверка.

из Почему Python является динамическим языком, а также языком со строгой типизацией . Также

На динамически типизированном языке переменная это просто значение, привязанное к название; значение имеет тип - как "целое число" или "строка" или "список" - но Сама переменная этого не делает. Вы могли бы есть переменная, которая прямо сейчас держит номер, а затем назначить Строка к нему, если вам нужно его изменить.

Кроме того, isinstance () и issubclass () могут использоваться для проверки типов. Если вы хотите убедиться, что аргумент имеет тип MyClass, вы можете проверить внутри функции. Вы даже можете ввести значение аргумента (если у вас есть конструктор, принимающий такое значение) и присвоить его my_object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...