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

Руководство по расширению IPTHON

Что такое расширения ipython, как их установить и как написать и опубликовать свое собственное расширение?. Tagged с ipython, python.

Что такое расширения ipython?

Изменение ipython очень просто. Нужно выполнить какой -нибудь код при стартапе? Добавьте его в Справочник запуска Анкет Необходимо изменить поведение кэширования, уровень словесности исключений или цветовая тема? Откройте .ipython_config.py Подайте и измените все там. Но если вы переключитесь на другой компьютер, вам придется снова внести все изменения. Или, может быть, ваш коллега спрашивает вас, как настроить свой ipython, так что он будет выглядеть “Каким бы крутым, как у тебя” Анкет Есть лучший способ, чем просить его изменить некоторые файлы конфигураций. Вы можете поделиться своими изменениями в качестве расширения!

Расширения ipython – отличный способ решить обе проблемы. Любое изменение конфигурации может быть превращено в расширение и обменивается с другими (или просто установлено на втором компьютере). Кроме того, магические функции, которые вы создаете, могут быть превращены в расширения. Думайте о расширениях как ipython плагины – Вы можете написать их самостоятельно или установить из PYPI и после того, как вы включите их, они изменят поведение iPython или добавят несколько новых функций.

Вы можете сохранить расширения для себя, сохраняя их в ~/.ipython/extensions папка или опубликовать их на PYPI. В этой статье я покажу вам, как установить существующее расширение и как написать и опубликовать свое собственное.

Как использовать расширения ipython?

Чтобы использовать расширение, вам сначала нужно загрузить его с помощью %load_ext командование Ipython приходит с 2 расширения В комплекте по умолчанию: %AutoreLoad и %Storemagic Анкет В прошлом было больше, но они были перемещены в разные пакеты. %AutoreLoad , описано в Еще один пост , может использоваться для автоматической перезагрузки импортируемых модулей перед выполнением кода. Это может быть полезным инструментом при написании модуля. %Storemagic загружается по умолчанию и позволяет хранить переменные, макросы и псевдонимы в базе данных SQLite, которые поставляются с iPython. Ipython не хранит эти объекты между сеансами, поэтому, если вы не хотите написать и прочитать свои переменные из файла, используя %Storemagic Ваш лучший вариант – сохранить и повторно их использовать.

Чтобы включить расширение, вам просто нужна одна команда:

%load_ext my_extension

Расширения могут иметь разные эффекты:

  • Некоторые будут работать сразу. Например, те, которые изменяют конфигурацию ipython.
  • Другие должны быть включены в первую очередь. Например, %AutoreLoad Расширение по умолчанию ничего не делает. Вам нужно включить автоматическую загрузку, работая %AutoreLoad 1 или %AutoreLoad 2 Анкет
  • А некоторые добавят новые функции в iPython, например, новые функции Magic.

Установка расширений от PYPI

Давайте посмотрим, как мы можем расширить функциональность iPython, добавив несколько новых расширений. Есть два хороших, которые я использую для профилирования кода Python: line_profiler и memory_profiler Анкет Первый можно использовать для создания линии отчета о времени выполнения вашего кода (когда вы хотите определить, какая строка вашего кода является медленной). Второй работает аналогично, но на этот раз он показывает вам использование памяти вашего приложения.

Давайте установим line_profiler:

$ pip install line_profiler

Теперь мы можем использовать этот профилировщик в ipython:

%load_ext line_profiler

Загрузка расширения добавит %lprun Волшебная функция. Чтобы использовать его, нам нужно предоставить имена функций/модулей, которые мы хотим профилировать, а затем оператор, который мы хотим запустить.

Допустим, у нас есть какой -то медленный код, который мы хотим проверить. В качестве примера я буду использовать следующий, довольно бесполезный код:

Мы можем использовать наше недавно установленное расширение для профиля этого скрипта:

Вывод из %lprun Команда предоставит вам подробную информацию о каждой строке указанной вами функции. Вы можете увидеть, сколько раз эта линия была выполнена, какое время было время и «за удар», и какой процент от общего времени, проведенного в этой функции, был потрачен на эту конкретную линию. Если вы думаете, что есть проблема с определенной строкой, Line_profiler также покажет вам, в каком файле находится эта функция, поэтому вам не нужно искать ее.

В моем случае вы можете видеть, что весь сценарий был довольно быстрым – для финиша потребовалось около 0,6 секунды. Большую часть времени была потрачена на выполнение этой инструкции: Результат + 5 в строке 16 slow_module.py Файл, внутри b_function функция

Если вы хотите искать больше расширений ipython, есть 2 хороших местах, чтобы найти их:

  • ИНДЕКС расширений IPYTHON – Вики -страница в репозитории GitHub iPython, которая содержит огромный список доступных расширений. Все записи здесь курируются вручную. Некоторые из них могут быть устаревшими, и они больше не будут работать, так как API IPython для расширений изменился между основными версиями. Но это отличное место для поиска определенного расширения, так как у каждой записи есть краткое описание того, что она должна делать. Если вы найдете расширение, которое вы хотите использовать, и оно не может установить или загрузить, попробуйте скопировать и вставить код расширения в iPython – это может работать таким образом. И если это произойдет, попробуйте превратить этот код в расширение и отправьте запрос на привлечение, чтобы обновить исходную версию (подробнее о том, как создать свои собственные расширения ниже).
  • Framework:: Ipython Filter на pypi – Обмен расширениями на PYPI теперь является рекомендуемым способом. Это делает установку расширений намного проще. Но иногда наращивания не соответствуют должным образом, поэтому вы также можете найти некоторые, найдя «ipython» или «ipython magic» на PYPI.

Написание расширения

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

  • Создайте файл с load_ipython_extension функция Эта функция будет вызвана при запуске %load_ext my_extension Анкет Внутри этой функции вы должны поместить весь код, который вы хотите сделать после загрузки вашего расширения. Например, если ваше расширение создает волшебную функцию, поместите эту волшебную функцию здесь.
  • [ Необязательно ] Если вы хотите иметь возможность разгрузка Ваше расширение, вы можете добавить unload_ipython_extension функционировать. Загрузка расширения включает его и разгрузка – выключает. Не имеет смысла разгружать расширение, которое добавляет новые магические функции, если вы не хотите отключить их по какой -то причине. Но это может быть полезно, если ваше расширение изменяет поведение ipython. Например, если у вас есть расширение, которое автоматически измеряет выполнение каждой команды, которую вы запускаете, и в какой -то момент вы хотите избавиться от этого поведения, вы можете разгрузить его.
  • Наконец, вам нужно сохранить файл в месте, где iPython может получить к нему доступ. Внутри .ipython Справочник конфигурации с именем расширения где вы можете хранить свои расширения.

Допустим, мы хотим написать расширение, которое добавит новую волшебную функцию в iPython. Вот весь код, который нам нужен:

Register_line_magic Функция повернет наше Lmagic Функция в магическую функцию ipython. Имейте в виду, что load_ipython_extension имеет определенную подпись, которую вам нужно использовать – она должна принять ipython аргумент Если вы не предоставите этот аргумент, ваше расширение не сработает.

Сохраните этот код внутри ~/.ipython/extensions/reverser.py файл. Имя используемого вами файла будет именем вашего расширения в iPython. Вы можете переименовать его, если вам не нравится имя реверс , Но не забудьте передать это новое имя %load_ext функция

Теперь мы можем загрузить и проверить наше расширение в Ipython:

In [1]: %load_ext reverser
Loading extensions from ~/.ipython/extensions is deprecated.
We recommend managing extensions like any other Python packages, in site-packages.

In [2]: %reverse hello world!
Out[2]: '!dlrow olleh'

Отлично, это работает! Если мы добавим unload_ipython_extension , мы также могли бы запустить %Unload_ext reverser , но это не имеет большого смысла для расширения, которое создает волшебную функцию.

Итак, так вы можете написать свои собственные расширения ipython. Вам может быть интересно – что с этим предупреждением об ископке, которое мы видели, когда импортировали наше расширение:

Расширения нагрузки из ~/.ipython/расширения устарели. Мы рекомендуем управлять расширениями, такими как любые другие пакеты Python, в пакетах на сайте.

Значит ли это, что мы сделали что -то не так, поместив наше расширение в расширения папка? Не волнуйтесь, это правильная папка. Это предупреждение о том, что вы должны поделиться своим расширением с другими, опубликовав PYPI. Если вы думаете, что ваше расширение может быть полезным для других, вы обязательно должны это сделать! Я не думаю, что мой реверс, но с целью иллюстрации я все равно собираюсь опубликовать его 😉.

Расширение публикации на PYPI

Чтобы опубликовать мое расширение, мне нужно превратить его в пакет Python. Есть много замечательных учебных пособий по созданию пакетов Python. Но чтобы сделать мой пример простым, я просто сделаю Абсолютно необходимо Шаги по созданию пакета Python, следуя рекомендациям из Управление по упаковке Python Анкет Так что, пожалуйста, не принимайте эту статью в качестве примера того, как создать пакеты Python 😅.

Вот структура пакета:

ipython-reverser/
├── LICENSE
├── README.rst
├── ipython_reverser
│   └── __init__.py
└── setup.py

А вот что внутри каждого из файлов:

  • Лицензия – Это дополнительный файл, но это хорошая практика, чтобы указать лицензию для каждого из ваших проектов. Если вы не добавите лицензию, Никто не может использовать его ! Так что не думайте, что проекты без лицензии бесплатны для копирования и повторного использования!
  • Readme.rst – Еще один дополнительный файл, но хорошо объяснить, что делает этот проект. Содержание этого файла будет отображаться на GitHub.
  • setup.py Содержит следующий код:
# setup.py
from setuptools import setup

setup(
      name="IPythonReverser",
      version="0.1",
      packages=["ipython_reverser"],
      license="MIT",
      author="Sebastian Witowski",
      author_email="sebastian@switowski.com",
      url="http://www.github.com/switowski/ipython-reverser",
      description="IPython magic to reverse a string",
      long_description=open("README.rst").read(),
      keywords="ipython reverser reverse",
      install_requires = ['ipython'],
      classifiers=[
          "Development Status :: 3 - Alpha",
          "Intended Audience :: Developers",
          "Framework :: IPython",
          "Programming Language :: Python",
          "Topic :: Utilities",
      ],
)
  • ipython_reverser/__init__.py – В более старых версиях Python (до Python 3.3) вам нужно было иметь __ init__.py Файл в каждом из подкаталогов вашего пакета. Без этого вы не сможете импортировать функции из подкаталогов. В более новых версиях Python они Больше не нужно , но есть преимущество в использовании – если вы создаете такой файл, он будет автоматически выполняться при импорте модуля. Итак, я помещаю код своего расширения внутрь:
# ipython_reverser/ __init__.py
from IPython.core.magic import register_line_magic

def load_ipython_extension(ipython):
    @register_line_magic("reverse")
    def lmagic(line):
        "Line magic to reverse a string"
        return line[::-1]

Вы можете найти исходный код пакета на GitHub Анкет

Создание пакета

Теперь мне нужно установить некоторые инструменты, которые я буду использовать на следующем шаге (если вы используете виртуальную среду, вы можете пропустить Python3 -m часть следующих команд):

Python3 -m Pip Install -USER -облегчение Колесо Setuptools

Далее я генерирую распределительный пакет:

python3 setup.py sdist bdist_wheel

Это создаст пакет внутри dist/ каталог.

Чтобы опубликовать мой пакет в PYPI, мне нужно установить еще один инструмент под названием шпагат :

Python3 -m Pip Install -USER -Обправлять шпагат

Необязательный шаг

Если вы впервые публикуете пакет в PYPI, вы можете пройти тестовый запуск и опубликовать его в Testpypi Анкет Таким образом, вы можете проверить, работает ли все, не влияя на настоящий PYPI. Чтобы опубликовать свой пакет в PYPI, запустите следующую команду: Python3 -m Twine upload -repository-url https://test.pypi.org/legacy/dist/* В первый раз, когда вы взаимодействуете с Twine, он попросит вас об этом имени пользователя и пароля. Так что убедитесь, что Создайте учетную запись на PYPI.

Чтобы установить пакет из TestPypi, вам нужно пройти -индекс-урл Параметр для PIP: python3 -m pip install-index-url https://test.pypi.org/simple/-no-deps your-package

Конец необязательного шага

Наконец, я могу опубликовать пакет в PYPI со следующей командой:

python3 -m -шпагат загрузка Dist/*

Twine попросит вас о вашем имени пользователя и пароля, а затем вы увидите строку прогресса, указывающая, что все работает нормально.

Теперь любой может установить мой пакет ipythonReverser, используя PIP:

Python3 -m Pip установить ipythonReverserer

и используйте его в ipython:

In [1]: %load_ext ipython_reverser

In [2]: %reverse 'hello world from PyPI!'
Out[2]: "'!IPyP morf dlrow olleh'"

Одна вещь, которую нужно помнить – на этот раз мы должны использовать Название модуля Когда мы загружаем наше расширение. Итак, мы используем %load_ext ipython_reverser вместо %load_ext reverser Анкет

Выводы

Расширения являются одной из самых мощных особенностей iPython. Их очень легко создать и публиковать на PYPI, поэтому, если вы придумали отличное расширение (что -то более полезное, чем обращение строк 😉), убедитесь, что вы поделитесь этим!

Изображение из: Неспособный

Оригинал: “https://dev.to/switowski/ipython-extensions-guide-35cn”