Инструменты Python Tools для Visual Studio, о новинках из первых рук
Эта статья написана Павлом Минаевым - разработчиком из команды PTVS специально для публикации в нашем корпоративном блоге на Хабрахабре. Для большего охвата, дублирую эту статью здесь. Все ваши комментарии будут переданы команде.
Здравствуйте! Я – разработчик из команды Python Tools for Visual Studio. На днях мы выпустили новую бета-версию нашего продукта, и, воспользовавшись поводом, в этот раз я хотел бы поподробнее рассказать о том, что из себя представляет PTVS, и что он может вам предложить.
Что такое PTVS?
Если вкратце, то Python Tools for Visual Studio (далее по тексту – PTVS), как, в общем-то, и следует из названия – бесплатное расширение для Visual Studio 2010 и выше, добавляющее в эту IDE полноценную поддержку Python. Поставив его себе, вы получаете редактирование кода на Питоне с подсветкой и продвинутым автозавершением, навигацией по коду, рефакторингом, отладкой, профилированием, и поддержкой Django с возможностью публиковать веб-сайты на Windows Azure в два клика. При этом поддерживаются все редакции Visual Studio, позволяющие установку расширений – как платные Professional, Premium и Ultimate, так и бесплатный Shell. В сочетании с последним, PTVS составляет полноценную бесплатную среду разработки на Python под Windows – и в этой версии мы сделали удобный комбинированный установщик для VS Shell + PTVS. Если же вы уже поставили себе Visual Studio 2013 Preview, то в диалоге New Project вас ждет приятный сюрприз:
Наш проект, в некотором роде, уникален для Microsoft. Открытыми (под Apache License 2.0) исходниками нынче никого не удивишь, но мы не просто публикуем исходники на CodePlex, но и приглашаем всех желающих совместно работать над проектом. Да-да, мы принимаем сторонний код!
И напоследок, поскольку с этим моментом чаще всего возникает путаница: PTVS – это не IronPython, и это не среда, ориентированная исключительно на IronPython. Мы поддерживаем практически все реализации Питона в той или иной степени – CPython, IronPython, Jython, PyPy, Stackless – но приоритетным является поддержка стандартного, и используемого большинством разработчиков на Питоне, интерпретатора CPython.
Далее я рассмотрю ряд наиболее интересных и уникальных возможностей PTVS более подробно.
Работа с кодом
Пожалуй, для любого разработчика, в первую очередь именно удобство работы с кодом является определяющем в выборе IDE. Именно поэтому продвинутый движок для разбора питоновского кода - на котором реализованны автодополнения, рефакторинг, символьный поиск и прочие ключевые фичи - был первым, что было создано в рамках проекта PTVS. С каждой новой версией мы улучшали качество разбора, и бета 2.0 – не исключение.
Простым автодополнением для динамически типизированных языков сегодня уже никого не удивишь, но многие редакторы «буксуют» на даже на тривиальных примерах использования динамических возможностей языка. Возьмем, например, вот такой код:
def f(x):
def g(y):
return x + y
return g
a = f(1)(2)
b = f(3.0)(a)
c = f(u'a')(str(b))
d = (a, b, c)[input()]
Поскольку оператор сложения в Питоне полиморфен, то тип значения, возвращаемого g – и, как следствие, тип значений в a, b и c – зависит исключительно от типов передаваемых аргументов. Тип d наиболее сложен, поскольку он косвенно зависит от типов всех трех предыдущих переменных – при этом редактору нужно сначала собрать, а потом разобрать кортеж.
PTVS пытается однозначно определить тип при каждом конкретном вызове, учитывая ранее выведенные типы передаваемых аргументов. Вот подсказки и дополнения, которые выдаются в редакторе для различных переменных в этом коде:
Как видите, в последнем случае у переменной несколько потенциальных типов, и автодополнение отображает их все.
На результат вывода типов можно посмотреть и с другой стороны, если запросить подсказку для параметра функции в её теле:
Здесь собраны все типы аргументов, с которыми функция вызывается где-либо в коде – автодополнение для них в теле функции будет работать соответствующим образом. У этого есть интересное следствие – если вы используете TDD, и сначала пишете тесты для ваших функций и классов, а потом уже их реализации, то вы автоматически получите корректное автодополнение для всех параметров.
Помимо автодополнений, работает также и поиск объявлений и ссылок на переменные. Здесь у PTVS есть одно интересное дополнение – если переменная, с которой начался поиск, ссылается (или может ссылаться) на функции или классы, то в результатах поиска, кроме строки, на который этой переменной было присвоено значение, будут также и исходные объявления этих функций и классов – даже если значение было присвоено не напрямую. Например, если добавить к коду выше такие строки:
h = f if input() else f(a)
print h(b)
и выполнить команду Find All References на h, то получим следующий результат:
Как видите, в списке фигурирует функция g, поскольку именно её вернул вызов f(a). Разумеется, это отражается и в результатах автодополнения при попытке вызвать h – в предлагаемых вариантах сигнатур будут фигурировать все известные варианты для f и g:
Отладка смешанного кода
Эксклюзив в бете 2.0 – такого больше нет нигде. Это тот самый случай, когда одна картинка стоит тысячи слов. Вот она:
На скриншоте – отладчик, присоединенный к программе на C#, которая загружает в себя CPython, который, в свою очередь, загружает модуль расширения, написанный на C++ - и все эти три вещи вызывают друг друга довольно-таки запутанным образом, который можно изучить в окне стека вызовов. Разумеется, можно создавать breakpoints во всех проектах, но самое главное, что дает такой комбинированный режим – возможность пошаговой отладки межъязыковых вызовов. Например, если выполнить команду Step In на строке питоновского кода , которая вызывает метод класса, реализованного в C++, то вы попадете в исходник этого метода. Точно так же это работает для кода на C++ или C#, вызывающего PyObject_CallObject для функции, написаной на Питоне. Поддерживаются также и вызовы нативного кода в обычных динамических библиотеках через ctypes.
Хотя на скриншоте показана одновременная отладка трех языков, на практике чаще всего дело ограничивается двумя – Питоном и C++ (или C) – либо это программа на Питоне, в которой используются модули расширения, либо программа на C++, использующая Питон в качестве скриптового языка. По этой причине мы добавили в отладчик ряд возможностей, доступных только для C/C++. Обратите внимание на окно Locals на скриншоте, и развернутое представление значения переменной a_natobj, которая ссылается на объект класса, реализованного на C++: одновременно с питоновским представлением объекта она показывает и C++-представление структуры, которая реализовывает его класс. Есть и зеркальное отображение питоновских объектов со стороны C++ - вот как выглядит то же самое окно Locals в функции frob:
Как видите, значения переменных, объявленных в C++ как PyObject (или какой-либо другой стандартный тип из Python API), отображают питоновские представления этих объектов одновременно с полями соответствующих C-структур.
Отладочный REPL
Наличие обычного REPL для Питона является стандартным в IDE для него, и PTVS не является исключением – разумеется, мы поддерживаем также и подсветку синтаксиса, и автодополнение (причем последнее, по возможности, работает напрямую со значениями в памяти, чтобы давать для них аккуратные подсказки). Но мы пошли дальше, и сделали поддержку «живого» REPL при отладке кода – то есть REPL работает непосредственно над данными в отлаживаемом процессе, позволяя вам на лету вычислять сложные выражения и переопределять классы и функции. Вот скриншот с отладочным REPL для первого примера из этой статьи:
Django и Windows Azure
PTVS поддерживает создание веб-приложений на Django, предоставляя подсветку синтаксиса, автозавершение кода и отладку для шаблонов отображений:
И, начиная с этой версии PTVS, созданные таким образом приложения можно опубликовать на веб-сайт в Windows Azure с легкостью, которая ранее была доступна только для ASP.NET:
Et voilà!
Да-да, веб-сайты Azure теперь поддерживают Python! Вы можете также использовать и другие возможности Azure – table service, blob service, service bus, storage queues и т.д. – в ваших приложениях на Питоне при помощи официального Windows Azure SDK для Python, над которым также работает наша команда. При этом SDK является кросс-платформенным: единственным требованием для него является Python 2.6 или выше.
Профилирование
И снова скриншоты скажут куда больше, чем слова:
… и многое другое!
Возможности PTVS не ограничиваются вышеперечисленным – у нас есть и другие интересные фичи, такие, как рефакторинг, работа с virtualenv и управление пакетами через pip и easy_install, удаленная отладка программ на Linux и OS X, поддержка IPython в REPL (с визуализацией графиков), и отладка и профилирование питоновского кода на MPI-кластерах. Вы можете почитать о них более подробно на странице документации проекта, или посмотреть обзорное видео.
Ваше мнение очень важно для нас
Нет, серьезно, оно действительно важно! У нас есть открытый баг-трекер, и мы всегда рады увидеть в нем баг-репорты и предложения от пользователей. Насчет предложений – это не пустой звук. Когда мы начинаем работать над новой версией, и решаем, что именно в ней будет, то первое, что мы делаем – открываем список feature requests в трекере, сортируем по голосам пользователей, и смотрим, что оказалось наверху. Так, в версии 2.0 мы реализовали пять фич из top 10 по голосам, в том числе три, которые были на первых трех местах. Если же вы хотите просто задать вопрос или обсудить что-то, это можно сделать на нашем форуме. И, разумеется, я буду рад ответить на любые ваши вопросы в комментариях к этой статье.
Comments
Anonymous
July 03, 2013
Здравствуйте! Я немного запутался. Для того, чтобы использовать данное дополнение VS 2012 Express не подойдет? Надо либо ставить 2013 Превью, либо пользоваться платной 2012. Правильно?Anonymous
July 09, 2013
Нет, вы можете использовать Visual Studio 2012 Shell, оболочку, которая поставляется бесплатноAnonymous
July 10, 2013
....Всё верно. Но, "маленькое"(?!)... Если хотите, "качество". Воспользуйтесь Python (не ниже) 3.3 и Visio 2012( интегрированной) + Visio 2010 Premium. По крайней мере, "ошибок", будет меньше...