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

Создание волшебных функций в iPython – часть 1

Узнайте, как сделать свои собственные волшебные функции в iPython, создавая функцию магической линии. Помечено с iPython, Python.

Функции 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.

Я надеюсь, что вам понравилось это короткое руководство, и если у вас есть вопросы или если у вас есть классная волшебная функция, которую вы хотели бы поделиться – отбросить меня электронная почта Или просто дайте мне знать в комментариях!

Оставайтесь настроиться на следующие запчасти. Нам все еще нужно покрыть клеточная магия Функции, Линия и клеточная магия Функции и Волшебство классы.

Изображение из: Пэтэльс

  1. Это шутка. Мы не используем Польская нотация в Польше ;). ↩

Оригинал: “https://dev.to/switowski/creating-magic-functions-in-ipython—part-1-387j”