Функции iPython Magic
Одна из прохладных особенностей iPython – Волшебные функции – Функция помощника встроена в iPython. Они могут помочь вам легко Начните интерактивный отладчик , Создать макрос , Запустите заявление через код Profiler или измерить его «время выполнения и делать много более распространенных вещей.
Что еще лучше, вы можете создавать свои собственные волшебные функции. Существует 2 различных типа волшебных функций. Первый тип – называется Линия магии – префиксы с %
и работать как команда, набранная в вашем терминале. Вы начинаете с имени функции, а затем пропустите некоторые аргументы, например:
In [1]: %timeit range(1000) 255 ns ± 10.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Мой любимый – это % отладки функция. Представьте, что вы запустите некоторый код, и он бросает исключение. Но так как вы не были готов к исключительному, вы не проводили его через отладчик. Теперь, чтобы иметь возможность отладить его, вы обычно вернулись, поставьте несколько точек останова и повторно повторный код. К счастью, если вы используете iPython, есть лучший способ! Вы можете запустить % отладки
Сразу после того, как исключение произошло, и iPython начнется и интерактивный отладчик для этого исключения. Это называется Пост-Мортема отладки И я абсолютно люблю это!
Второй тип волшебных функций – клеточные магии И они работают на блоке кода, а не на одной строке. Они префиксированы с %%
Отказ Чтобы закрыть блок кода, когда вы находитесь внутри функции клеточной магии, нажмите Введите
дважды. Вот пример Время течения
Функция работает на блоке кода:
In [2]: %%timeit elements = range(1000) ...: x = min(elements) ...: y = max(elements) ...: ...: 52.8 µs ± 4.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Обе линии магии, так и магии клеток могут быть созданы просто украшение функции Python. Еще один способ написать класс, который наследует от IPython.core.magic. Магические средства
Отказ Я охвачу этот второй метод в другой статье.
Создание линии магической функции
Это все теория. Теперь, давайте напишем нашу первую волшебную функцию. Начнем с линия волшебства
А во второй части этого учебника мы сделаем клеточная магия
Отказ
Какую волшебную функцию мы собираемся создавать? Ну, давайте сделаем что-то полезное. Я из Польши, а в Польше мы используем Польская нотация для написания математических операций. Так вместо письма 2 + 3
мы пишем + 2 3
. И вместо письма (5 - 6) * 7
Мы пишем * - 5 6 7
1 Отказ
Давайте напишем простой польский переводчик. Это будет выражение в польской записи в качестве ввода и вывода правильного ответа. Чтобы сделать этот пример короткой, я ограничу его только к основным арифметическим операциям: +
, -
, *
и /
Отказ
Вот код, который интерпретирует польскую запись:
def interpret(tokens): token = tokens.popleft() if token == "+": return interpret(tokens) + interpret(tokens) elif token == "-": return interpret(tokens) - interpret(tokens) elif token == "*": return interpret(tokens) * interpret(tokens) elif token == "/": return interpret(tokens) / interpret(tokens) else: return int(token)
Далее мы создадим % pn
Волшебная функция, которая будет использовать вышеуказанный код для интерпретации польской записи.
from collections import deque from IPython.core.magic import register_line_magic @register_line_magic def pn(line): """Polish Notation interpreter Usage: >>> %pn + 2 2 4 """ return interpret(deque(line.split()))
Вот и все. @register_line_magic
Декоратор поворачивает наше PN
функция в % pn
волшебная функция. линия
Параметр содержит то, что передается в волшебную функцию. Если мы назовем это следующим образом: % pn + 2 2
, линия
будет содержать + 2 2
Отказ
Чтобы убедиться, что iPython загружает нашу волшебную функцию при запуске, скопируйте весь код, который мы только что написали (вы можете найти весь файл на GitHub ) в файл внутри каталога iPython Startup. Вы можете узнать больше об этом каталоге в Post Отказ В моем случае я спасаю его внутри файла под названием: ~/.ipython/profile_default/startup/magic_functions.py
(Имя файла не имеет значения, а каталог, где вы ставите, важно).
Хорошо, пришло время проверить это. Начните iPython и давайте сделаем некоторые Польский Математика:
In [1]: %pn + 2 2 Out[1]: 4 In [2]: %pn * - 5 6 7 Out[2]: -7 In [3]: %pn * + 5 6 + 7 8 Out[3]: 165
Идеально, это работает! Конечно, это довольно элементарно – он только поддерживает 4 оператора, он не очень хорошо справляется с исключениями, и поскольку он использует рекурсию, он может потерпеть неудачу для очень длительных выражений. Кроме того, очередь
модуль и интерпретировать
Функция теперь будет доступна в ваших iPython Sessions, поскольку какой код вы поставили magic_function.py
Файл будет запущен в запуске iPython. Но вы только что написали свою первую волшебную функцию! И это было не так сложно!
На данный момент вы, вероятно, задаетесь вопросом – Почему мы не просто написали стандартную функцию Python? Это хороший вопрос – в этом случае мы могли бы просто запустить следующий код:
In [1]: pn('+ 2 2') Out[1]: 4
или даже:
In [1]: interpret(deque('+ 2 2'.split())) Out[1]: 4
Как я уже сказал в начале, волшебные функции обычно являются функциями помощника. Их главное преимущество в том, что когда кто-то видит функции с %
Префикс, ясно, что это волшебная функция из iPython, а не функция, определенная где-то в коде или встроенном. Кроме того, нет риска, что их имена будут сталкиваться с функциями из модулей Python.
Я надеюсь, что вам понравилось это короткое руководство, и если у вас есть вопросы или если у вас есть классная волшебная функция, которую вы хотели бы поделиться – отбросить меня электронная почта Или просто дайте мне знать в комментариях!
Оставайтесь настроиться на следующие запчасти. Нам все еще нужно покрыть клеточная магия Функции, Линия и клеточная магия Функции и Волшебство классы.
Изображение из: Пэтэльс
Это шутка. Мы не используем Польская нотация в Польше ;). ↩
Оригинал: “https://dev.to/switowski/creating-magic-functions-in-ipython—part-1-387j”