Как бороться с динамической типизацией?

Я довольно часто писал на Python какие-то вспомогательные вещи, иногда сравнительно крупные, но почти всегда не знание типа объекта с которым работаешь было не критичным. Плюс возможность разрабатывать в IPython сильно облегчала жизнь. И так было до тех пор, пока я не решил плотно использовать Twisted. И оказалось что в IPython не попишешь нормально, а занание типов параметров в функциях обратного вызова и классов из обширного становится необходимостью.

И вот тут то я оказался в неком тупичке. Есть большое количество разнообразных классов со сложными интерфейсами. Перепробованные IDE (Eclipse, PyCharm и даже Emacs) не позволяют воспользоваться автодополнением в незнакомых им классах, что логично. В результате, весь код начинает выглядеть как пример ниже.

def _call_later(self, request):
"""
тут какое-то описание функции
@param request: тут какое-то описание параметра
@type request: Request (1)
"""

Да, безусловно, указывать 1 для каждой из создаваемых функций типы передаваемых параметров это решение, только оно выглядит как откровенный костыль. В итоге, у меня создается ощущение, что я как-то не верно использую этот замечательный язык… Что не так? Как с этим жить? Наиболее подходящим вариантом выглядит то, что все помнят параметры у API наизусть, я же вполне могу писать на C++ с подстановкой параметров исключительно из открытых файлов.

9 Comments Как бороться с динамической типизацией?

  1. Alexander Alexeev (@afiskon)

    Задержите эту мысль. Перед вами уникальная возможность приобрести великое понимание сути вещей. Задержали? Сделайте глубокий вдох и приступайте к переписыванию вашего кода на Java с небольшими примесями Scala.

    Reply
    1. Alexander Stavonin

      Не вариант.даже с учетом всех проблем привносимых динамической типизацией, Python остается одним из самых простых языков программирования, при этом обладающий очень серьезными возможностями. А вот Scala – это C++ в мире JVM, безграничное количество возможностей выстелить себе в ногу.

      Reply
  2. Иван

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

    @param request: package.module.MyClass
    И тогда любой редктор смог бы понять, что это за переменная.

    Reply
    1. Alexander Stavonin

      да, я так и делаю (просто пример обрезанный). Тут просто проблема при изменении типов аргументов возникает. Плюс если передается массив /словарь, то уже такой финт не сработает.

      Reply
  3. Cyberax

    Я использую автокомплит из PyCharm. В большинстве случаев помогает.

    Ему можно давать хинты, типа:

    def blah(hello):

    “””

    @type hello: dict of (str, SomeObject)

    “””

    Потом в коде оно правильно выведет типы и предложит completion.

    Reply
  4. madhollander

    С ней не надо бороться, её надо использовать. Пишите меньше кода, насколько это возможно.

    Reply

Leave a Reply