Вопрос по python – Инструменты, помогающие разработчикам быстрее читать иерархию классов

7

В своей повседневной работе я в основном трачу время на Python / Django и Objective-C / CocoaTouch и js / jQuery.

Мой редактор по выборуvim для Python / Django и JS / JQuery иxcode для Objective-C / CocoaTouch.

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

Например, в Python / Django, когда я сталкиваюсь с некоторыми новыми функциями, представленными разработчиками django, мне становится любопытно, и я начинаю исследовать базу кода вручную. Например, когда основанные на классе представления были введены начиная с django 1.3, ссылка -https://docs.djangoproject.com/en/dev/topics/class-based-views/ - Я проверю приведенный пример кода:

from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

И попробуйте это на одном из моих проектов. Что еще более важно, мне интересно, что происходит за кулисами, поэтому я буду копаться в исходном коде -

# django/views/generic/__init__.py file

from django.views.generic.base import View, TemplateView, RedirectView
from django.views.generic.dates import (ArchiveIndexView, YearArchiveView, MonthArchiveView,
                                     WeekArchiveView, DayArchiveView, TodayArchiveView,
                                     DateDetailView)
from django.views.generic.detail import DetailView
from django.views.generic.edit import FormView, CreateView, UpdateView, DeleteView
from django.views.generic.list import ListView


class GenericViewError(Exception):
    """A problem in a generic view."""
    pass

Отсюда я прослежу его в обратном направлении к файлу django / views / generic / base.py и выясню, что именноTemplateView класс делает:

class TemplateView(TemplateResponseMixin, View):
    """
    A view that renders a template.
    """
    def get_context_data(self, **kwargs):
        return {
            'params': kwargs
        }

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

И здесь это показывает, чтоTemplateView класс наследует отTemplateResponseMixin а такжеView классы ... и я продолжаю копать дальше ... и так далее ...

The problem is, this is an extremely inefficient and slow process (to "follow" class hierachies manually and opening up each file along the way).

Таким образом, вопрос заключается в том, существует ли простой способ / инструмент пользовательского интерфейса (или другое визуальное решение), который анализирует код Python в конкретном проекте и визуализирует иерархии классов, которые я затем могу легко проверить, нажав кнопку & quot; на конкретный класс, о котором мне интересно читать?

Note что мне известна оболочка IPython, но она не так удобна для пользователя, как средство визуального отображения.

Например, тамF-Script в мире программирования Objective-C / iOS / Mac, которое не только предоставляет оболочку (очень похожую на оболочку python или IPython), но и предоставляет визуальный способ для разработчиков анализировать иерархии классов.

Эталонный скриншот: -

enter image description here

Так есть ли инструмент визуализации иерархии классов (специально для Python, но даже лучше, если он универсален и может использоваться для разных языков) ??? Каковы ваши методы эффективного ускорения при чтении открытого исходного кода ???

UPDATED

По совету ниже, я попробовалctags и плагин vimtaglist и я смог использовать:TlistOpen открыть боковой буфер в vim следующим образом:

enter image description here

Это выглядит действительно круто, как:TlistOpen теперь, по сути, показывает мне все классы и функции, которые доступны в моем текущем открытом буфере.

Моя проблема сейчас в том, что когда я пытаюсь сделатьCtrl] пока мой курсор включенTemplateViewЯ получаю следующую ошибку: -

enter image description here

Что я делаю неправильно? Это потому, что мой исходный код Django находится вvirtualenv? Или есть что-то конкретное, что я должен сделать, чтобы сделатьctags/taglist & Quot; известно & Quot; исходного кода Django?

Попробуйте exuberant ctags (как рекомендовано @Kay Zhu), я думаю, что есть команда / скрипт для генерации тегов из источника в вашем текущем env / virtualenv. cerberos
Я чувствую, что это неконструктивно для переполнения стека, но вполне по темеprogrammers.stackexchange.com Chris Morgan
Хорошо. Как я могу мигрировать? Calvin Cheng

Ваш Ответ

3   ответа
4

Теги действительно очень хорошее начало. (Повсюду на нем слишком много материала, поэтому я просто предоставлю вам одно дополнительное ключевое слово для поиска: ctags.)

В Vim это заканчивается (в базовом случае)Ctrl+] перейти к определению класса / функции иCtrl+T возвращать.

Привет, Крис, я получаю сообщение об ошибке при попыткеCtrl+]... я что-то пропустил? Calvin Cheng
Удалось заставить это работать, хотя очень ручной процесс. Вы случайно не узнали больше об использовании плагина ctags / taglist в контексте python virtualenv? Ссылка -stackoverflow.com/questions/10362085/… Calvin Cheng
Хорошо. Спасибо за чаевые. Calvin Cheng
Нет, я не знаю Генерация тегов всегда должна быть настроена. То, как я когда-либо использовал ctags, не потребовало бы ничего особенного для virtualenv; если вам нужны теги для чего-либо внутри virtualenv, укажите это как путь для создания тегов.
3

эффективный браузер классов это эффективно перемещается все в данном модуле. Я считаю, что не составит труда изменить этот инструмент для навигации по полной иерархии классов при некоторой помощи со стороныосмотреть модуль имодуль pyclbr.

Привет Рэймонд! Я помню тебя с EuroPython 2011 во Флоренции. Приятно видеть ваши ответы здесь на мои вопросы !!! Здорово! Calvin Cheng
3

Я используюобильные ctags сtaglist для vim. использованиеctrl] перейти к определению класса в текущем окне,ctrlw] перейти к определению в разделенном окне.

Вы можете установить exuberant ctags через homebrew:

brew install ctags

Обязательно используйте тот, который установлен на/usr/local/bin доморощенным, а не старымctags в/usr/bin.

Также полезно поставить--python-kinds=-vi в~/.ctags пропустить индексирование переменных и импорт для файлов Python.

Другой альтернативой будет использование вариантаcscope или жеpyscope хотя вы должны иметь свой VIM скомпилирован сcscope опция включена.

@ CalvinCheng да, просто не забудьте использоватьctags -R и не забудьте быть в то же времяpwd в качестве родительского каталогаvirtualenv каталог :)
Привет Кей, я только что получилctags и плагин vimtaglist установлены. Это выглядит многообещающе, но я используюvirtualenv так ли это влияет ли или нетctags а такжеtaglist могу найти класс, который я хочу просмотреть? Обновление вопроса выше с ошибками, которые я вижу ... Calvin Cheng

Похожие вопросы