Python Tools для Visual Studio, о новинках из первых рук

Источник: habrahabr
XaocCPS

Эта статья написана Павлом Минаевым int19h - разработчиком из команды PTVS специально для публикации в нашем корпоративном блоге на Хабрахабре. Делитесь вашими впечатлениями в комментариях. Все отзывы будут переданы команде.

Здравствуйте! Я - разработчик из команды Python Tools for Visual Studio. На днях мы выпустили новую бета-версию нашего продукта, и, воспользовавшись поводом, в этот раз я хотел бы поподробнее рассказать о том, что из себя представляет PTVS, и что он может вам предложить.

image

Что такое 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 вас ждет приятный сюрприз:

clip_image001

Наш проект, в некотором роде, уникален для 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 пытается однозначно определить тип при каждом конкретном вызове, учитывая ранее выведенные типы передаваемых аргументов. Вот подсказки и дополнения, которые выдаются в редакторе для различных переменных в этом коде:

clip_image002

clip_image003

clip_image004

clip_image005

Как видите, в последнем случае у переменной несколько потенциальных типов, и автодополнение отображает их все.

На результат вывода типов можно посмотреть и с другой стороны, если запросить подсказку для параметра функции в её теле:

clip_image006

Здесь собраны все типы аргументов, с которыми функция вызывается где-либо в коде - автодополнение для них в теле функции будет работать соответствующим образом. У этого есть интересное следствие - если вы используете TDD, и сначала пишете тесты для ваших функций и классов, а потом уже их реализации, то вы автоматически получите корректное автодополнение для всех параметров.

Помимо автодополнений, работает также и поиск объявлений и ссылок на переменные. Здесь у PTVS есть одно интересное дополнение - если переменная, с которой начался поиск, ссылается (или может ссылаться) на функции или классы, то в результатах поиска, кроме строки, на который этой переменной было присвоено значение, будут также и исходные объявления этих функций и классов - даже если значение было присвоено не напрямую. Например, если добавить к коду выше такие строки:

h = f if input() else f(a) print h(b)
и выполнить команду Find All References на h, то получим следующий результат:

clip_image007

Как видите, в списке фигурирует функция g, поскольку именно её вернул вызов f(a). Разумеется, это отражается и в результатах автодополнения при попытке вызвать h - в предлагаемых вариантах сигнатур будут фигурировать все известные варианты для f и g:

clip_image008clip_image009

Отладка смешанного кода

Эксклюзив в бете 2.0 - такого больше нет нигде. Это тот самый случай, когда одна картинка стоит тысячи слов. Вот она:

clip_image010

На скриншоте - отладчик, присоединенный к программе на 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:

clip_image011

Как видите, значения переменных, объявленных в C++ как PyObject (или какой-либо другой стандартный тип из Python API), отображают питоновские представления этих объектов одновременно с полями соответствующих C-структур.

Отладочный REPL

Наличие обычного REPL для Питона является стандартным в IDE для него, и PTVS не является исключением - разумеется, мы поддерживаем также и подсветку синтаксиса, и автодополнение (причем последнее, по возможности, работает напрямую со значениями в памяти, чтобы давать для них аккуратные подсказки). Но мы пошли дальше, и сделали поддержку "живого" REPL при отладке кода - то есть REPL работает непосредственно над данными в отлаживаемом процессе, позволяя вам на лету вычислять сложные выражения и переопределять классы и функции. Вот скриншот с отладочным REPL для первого примера из этой статьи:

clip_image012

Django и Windows Azure

PTVS поддерживает создание веб-приложений на Django, предоставляя подсветку синтаксиса, автозавершение кода и отладку для шаблонов отображений:

clip_image013

И, начиная с этой версии PTVS, созданные таким образом приложения можно опубликовать на веб-сайт в Windows Azure с легкостью, которая ранее была доступна только для ASP.NET:

clip_image014

Et voilà!

clip_image015

Да-да, веб-сайты Azure теперь поддерживают Python! Вы можете также использовать и другие возможности Azure - table service, blob service, service bus, storage queues и т.д. - в ваших приложениях на Питоне при помощи официального Windows Azure SDK для Python, над которым также работает наша команда. При этом SDK является кросс-платформенным: единственным требованием для него является Python 2.6 или выше.

Профилирование

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

clip_image016

clip_image017

clip_image018

… и многое другое!

Возможности PTVS не ограничиваются вышеперечисленным - у нас есть и другие интересные фичи, такие, как рефакторинг, работа с virtualenv и управление пакетами через pip и easy_install, удаленная отладка программ на Linux и OS X, поддержка IPython в REPL (с визуализацией графиков), и отладка и профилирование питоновского кода на MPI-кластерах. Вы можете почитать о них более подробно на странице документации проекта, или посмотреть обзорное видео.

Ваше мнение очень важно для нас

Нет, серьезно, оно действительно важно! У нас есть открытый баг-трекер, и мы всегда рады увидеть в нем баг-репорты и предложения от пользователей. Насчет предложений - это не пустой звук. Когда мы начинаем работать над новой версией, и решаем, что именно в ней будет, то первое, что мы делаем - открываем список feature requests в трекере, сортируем по голосам пользователей, и смотрим, что оказалось наверху. Так, в версии 2.0 мы реализовали пять фич из top 10 по голосам, в том числе три, которые были на первых трех местах. Если же вы хотите просто задать вопрос или обсудить что-то, это можно сделать на нашем форуме. И, разумеется, я буду рад ответить на любые ваши вопросы в комментариях к этой статье.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=33795