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

3-минутная грунтовка на декораторах Python

Скажем, вы работаете на большой банк. Ваш хакер коллега реализовал волшебную функцию, которая использует SSH, чтобы войти в основной сервер банка (написанный в COBOL, который вы вообще не знаете), анализируют использование ЦП за последние 24 часа и возвращает результат в виде загадочного строка. Отказ Ваш босс спрашивает … 3-минутный грунт на декораторах Python Подробнее »

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

Скажем, вы работаете на большой банк.

Ваш хакер коллега реализовал волшебную функцию, которая использует SSH, чтобы войти в основной сервер банка (написанный в COBOL, который вы вообще не знаете), анализируют использование ЦП за последние 24 часа и возвращает результат в виде загадочного строка. Отказ

Ваш босс просит вас изменить волшебную функцию, чтобы она возвращала целочисленное значение, которое легче обрабатывать. Другими словами, ваше вторичное банковское приложение (написанное в Python) ожидает, что теперь каждый звонок Magic_function приводит к целочисленной цене.

Конечно, вы можете перейти в код Magic_Function и переписать его …

… Но вы бы не рискуете ломать приложение и потерять миллионы долларов, не могли бы вы? Тем не менее, вы должны коснуться его, потому что существующие функции вне вашего управления уже вызывают Magic_function !

Решение простое: используйте функцию обертки и назначьте ее названию Magic_function ! Вот как вы достигли этого:

def integer_decorator(func):
    ''' Returns a function that converts the output of func to an integer. '''

    def wrapper():
        output = func()
        s = 0
        for x in output.split("+"):
            s += int(x)
        return s

    return wrapper


# This function is written by your hacker colleague.
# You don't want to touch it!
def magic_function():
    # ... complex stuff happening here ...
    return "89898292211+1123+13"

magic_function = integer_decorator(magic_function)

# ... somewhere in the code...
print(magic_function())
# 89898293347

Как видите, вы не трогаете Magic_function Но его поведение все еще изменилось! Для этого вы сначала создаете функцию integer_decorator который принимает функцию аргумента Func и возвращает функцию обертки, которая преобразует вывод строки в целое число.

Затем мы назначаем эту функцию обертки на имя Magic_function И, таким образом, измените поведение Magic_function Когда он используется в коде. Это происходит в линии magic_function (magic_function) Отказ

Декоратор просто возвращает новый объект функции, который «украшает» (или изменяет) существующую функцию, которая передается как аргумент. В нашем случае Integer_Decorator возвращает модифицированный Magic_function Отказ

Есть какой-то синтаксический сахар того, как вы можете достичь то же самое немного легче. Линия magic_function (magic_function) Модифицирует поведение Magic_function Отказ То же самое можно достичь, когда «украшать» Magic_function используя @ ключевое слово:

@integer_decorator
def magic_function():
    # ... complex stuff happening here ...
    return "89898292211+1123+13"


# ... somewhere in the code...
print(magic_function())
# 89898293347

Таким образом, вы можете легко обогатить любую функцию с дополнительными функциями, используя @ ключевое слово.

Куда пойти отсюда?

Эксперты Python сегодня зарабатывают шестифункциональные зарплаты или больше. Стать кодер Python – это выгодный выбор жизни с огромными преимуществами для вас и вашей семьи!

Как вы становитесь экспертом? Просто: Читать дальше Кодирование Книги, чем ваши коллеги! Хотя ваши коллеги будут прочитать только одну книгу кодирования в год (MAX), вы можете прочитать одну книгу в неделю, чтобы получить 52x преимущество перед большинством кодеров.

Купить пакет “Coffee Break Python” сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.