Утиная набравка – чрезвычайно полезный стиль программирования, который действительно делает Python Awesome. Он позволяет нам «игнорировать» тип объекта и, скорее проверить, содержит ли объект функции или нет.
Отлично упоминается в Документация Python так как:
” Если это выглядит как утка и кряки, как утка, это должна быть утка »
Если кодовая база хорошо определена, это обеспечивает гибкость, позволяя полиморфную замену. Это позволяет нам избежать таких вещей Тип ()
и Isinstance ()
Отказ
Давайте рассмотрим этот пример. Мы создаем два класса, утки и восьмиката. Потому что восьмикат потрясающий, давайте предположим, что он способен к доставке.
class Duck: def quack(self): print("Quack, Quack") class Octocat: def meow(self): print("Github is awesome") def quack(self): print("Quack, Quack")
Теперь давайте создадим функцию make_it_quack ()
Давайте предположим, что мы не знаем о наборе утки, и нам нужно написать функцию, которая проверяет ли объект, который мы передаем в функцию типа Утка
И если мы вызываем Квалак ()
функция
def make_it_quack(object): if isinstance(object, Duck): object.quack() else: print("Only duck's can quack")
Если мы пройдем объект утки (скажи D
) наш выход будет:
make_it_quack(d) >>> Quack, Quack
Если мы пройдем объект OctOCAT (скажем, o
) Наш выход будет:
make_it_quick(o) >>> Only duck's can quack
В пакете могут быть тонны и тонны объектов, мы не можем набрать проверку на каждый возможный тип объекта (но это то, что люди будут делать, когда Python не существует !!), мы можем просто сделать следующее:
def make_it_quack(object): object.quack() make_it_quack(o) >>> Quack, Quack
Это сущность Утка, набрав Отказ
Смотри, прежде чем прыгать (lbyl) : Это стиль кодирования, который явные проверки для предварительных условий перед вызовом или поисками. Это характеризуется наличием многих Если
заявления.
Легче попросить прощения, чем разрешение : Это обычный стиль кодирования Python, который просто предполагает существование действительных ключей/атрибутов и только уловит исключения, если эти предположения оказываются ложными. Это делает код намного чище и обычно характеризуется наличием попробуйте
и кроме
заявления.
Давайте предположим, что мы анализируем некоторые метаданные
Словарь и нам нужно извлечь конкретное значение ключа
Lbyl путь
metadata = {"day": "Monday", "month": "December", "visited":True } if "day" in metadata and "month" in metadata and "visited" in metadata: visit = metadata["day"] else: print("Missing key")
WAFP путь
try: visit = metadata["visited"] except KeyError as e: print("{} not found".format(e))
Это довольно интуитивно понятно, почему EAFP лучше, чем подход LBYL.
Оригинал: “https://dev.to/sauravmaheshkar/introduction-to-duck-typing-in-python-5585”