Рубрики
Без рубрики

Python 3 – введение подсказки

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Python 3.5 Добавлена интересная новая библиотека под названием Набрав Отказ Это добавляет тип намекания на Python. Тип намекает в рода объявление аргументов ваших функций, чтобы иметь определенный тип. Однако подсказнение типа не является обязательным. Это просто намек, так что нет ничего, что не мешает программисту пропустить то, что они не должны. Это Python в конце концов. Вы можете прочитать спецификацию подсказки типа в PEP 484 Или вы можете просто прочитать теорию позади этого в Pep 483 Отказ

Давайте посмотрим на простой пример:

>>> def some_function(number: int, name: str) -> None:
    print("%s entered %s" % (name, number))

    
>>> some_function(13, 'Mike')
Mike entered 13

Это означает, что Некоторые_функция ожидает двух аргументов, где первое – это целое число, а вторая – это строка. Следует также отметить, что мы намекнули, что эта функция не возвращает.

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

def process_data(my_list, name):
    if name in my_list:
        return True
    else:
        return False

if __name__ == '__main__':
    my_list = ['Mike', 'Nick', 'Toby']
    print( process_data(my_list, 'Mike') )
    print( process_data(my_list, 'John') )

Теперь давайте добавим тип намекания на эту функцию:

def process_data(my_list: list, name: str) -> bool:
    return name in my_list

if __name__ == '__main__':
    my_list = ['Mike', 'Nick', 'Toby']
    print( process_data(my_list, 'Mike') )
    print( process_data(my_list, 'John') )

В этом коде мы намереваемся, что первый аргумент – это список, второй – это строка, а возвращаемое значение является логией.

Согласно PEP 484, «подсказки типа могут быть встроены классы (включая те, которые определены в стандартных библиотечных или сторонних модулях расширения), абстрактные базовые классы, типы, доступные в модулях типа, и определенные пользователем классы». Так что означает, что мы можем создать наш собственный класс и добавить намек.

class Fruit:
    def __init__(self, name, color):
        self.name = name
        self.color = color


def salad(fruit_one: Fruit, fruit_two: Fruit) -> list:
    print(fruit_one.name)
    print(fruit_two.name)
    return [fruit_one, fruit_two]

if __name__ == '__main__':
    f = Fruit('orange', 'orange')
    f2 = Fruit('apple', 'red')
    salad(f, f2)

Здесь мы создаем простой класс, а затем функцию, которая ожидает двух экземпляров этого класса и возвращает объект списка. Другая тема, которую я подумал, было интересно, это то, что вы можете создать псевдоним. Вот супер простой пример:

Animal = str

def zoo(animal: Animal, number: int) -> None:
    print("The zoo has %s %s" % (number, animal))

if __name__ == '__main__':
    zoo('Zebras', 10)

Как вы, возможно, догадались, мы просто псевдоним строка Введите с переменной Животное Отказ Затем мы добавили намек на нашу функцию, используя псевдоним животных.

Обертывание

Когда я впервые услышал о подсказке, я был заинтригован. Это аккуратная концепция, и я могу определенно увидеть для него использования. Первое использование случая, которое, на мой взгляд, просто самодоступно ваш код. Я работал над слишком многими основными базами кода, где трудно сказать, какую функцию или класс принимают и в то время как подсказка не придерживается ничего, это, безусловно, принесет некоторую четкость для некоторых из этого неоднозначного кода. Было бы аккуратно, если бы некоторые IDes Python добавляют дополнительный флаг, который может проверить подсказки типа вашего кода и убедиться, что вы правильно звоните в код.

Я настоятельно рекомендую проверить официальную документацию, так как там есть намного больше информации. PEPS также содержит много хороших деталей. Весело и счастливое кодирование!

Связанное чтение