Pull to refresh
0
Microsoft
Microsoft — мировой лидер в области ПО и ИТ-услуг

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

Reading time 6 min
Views 52K
Эта статья написана Павлом Минаевым 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 по голосам, в том числе три, которые были на первых трех местах. Если же вы хотите просто задать вопрос или обсудить что-то, это можно сделать на нашем форуме. И, разумеется, я буду рад ответить на любые ваши вопросы в комментариях к этой статье.
Tags:
Hubs:
+111
Comments 49
Comments Comments 49

Articles

Information

Website
www.microsoft.com
Registered
Founded
Employees
Unknown
Location
США