Задать вопрос
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    bbkmzzzz, результат хинтинга через object будет таким же, как если не хинтить вообще. Попробуйте, уберите хинтинг, ничего не поменяется.

    Хинтинг типа можно делать через Type[Base], но это требует ряд дополнительных условий, которые обсуждаются в ветке комментариев ниже. Если интересно, почитайте.
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    Andy_U, смотрите:

    Pycharm обладает всеми необходимыми данными о структуре проекта, он даже постоянно держит в голове абстрактное синтаксическое дерево всего кода. Стало быть, инспектировать тайп хинты он может и без лишних импортов. Об этом свидетельствует тот факт, что даже если ему указать в импорте не установленный модуль typing, хинтинг сразу начинает работать как положено.

    Мне этот модуль тоже не нужен, так как его функционал я в проектах не использую.

    А раз этот модуль не нужен ни мне, ни IDE, напрашивается очевидный вопрос: есть ли где в Pycharm какая-нибудь галочка, чтобы разрешить хинтинг без импорта, а просто указав в том же комментарии, например, a.b.Foo? Или быть может, есть какой-то плагин?

    Под "все подряд" я имел в виду не конкретно этот модуль typing, а в принципе технологию хинтинга, которая без импорта не позволяет хинтить тип из соседнего файла. Потому что в этом случае кругом появится куча ненужных импортов, которые могут привести к цикличному импорту.
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    bbkmzzzz, все, что вы написали, не имеет никакого отношения к моему вопросу, и это все я знаю. Я повторяю в очередной раз, хинтить объекты класса Base я умею, оно работает, спасибо. Мой вопрос как захинтить сам класс Base. Вы до сих пор не понимаете, что я хочу, и я не знаю уже как объяснить, но ниже я попробую на примере.

    Пример вашего хинтинга говорит среде, что функция принимает объекты класса Base, а мне нужно принять сам класс Base и подклассы этого класса, а объект предположим создать уже внутри. Разницу понимаете? На вашем скриншоте прекрасно работает, потому что делаете вы не то, о чем я спрашивал.

    Возьмем сферический пример в вакууме. Фабрика, которая принимает данные и список классов (но мы упростим, пусть будет строго два класса), чтобы определить наиболее подходящий класс для этих данных и вызвать конструктор, вернув объект. Например, функция принимает интенсивность света, и создает либо тёмный объект, либо светлый объект. Функция должна быть абстрактной и принимать абстракции. Сегодня она определяет светлый/темный, завтра она определяет горький/сладкий, далекий/близкий, простой/сложный. Я максимально упростил пример.

    class Base(object):
        def __init__(self, data):
            self.data = data
    
        def __repr__(self):
            return '<{} ({})>'.format(self.__class__.__name__, self.data)
    
    class Dark(Base):
        x = 0
    
    class Light(Base):
        x = 255
    
    def data_factory(data, Type1, Type2):
        delta1 = abs(data - Type1.x)
        delta2 = abs(data - Type2.x)
        if delta1 < delta2:
            SelectedType = Type1
        else:
            SelectedType = Type2
        obj = SelectedType(data)
        return obj
    
    print data_factory(10, Dark, Light)  # >>> <Dark (10)>
    print data_factory(126, Dark, Light) # >>> <Dark (126)>
    print data_factory(129, Dark, Light) # >>> <Light (129)>
    print data_factory(250, Dark, Light) # >>> <Light (250)>

    Научите меня делать хинтинг в функции data_factory, чтоб он не выдавал ошибки несоответствия типов в данном коде.
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    Если посмотрите, в коде не создается ни одного экземпляра.

    Потому что в коде нигде и функция не вызывается. Если ее вызвать, и передать в нее класс, будет подсвечиваться несоответствие типа. А если передать экземпляр, ошибки не будет. О чем я и говорил выше.

    Экземпляр создается на основе объекта класса

    Экземпляр класса это и есть объект класса, это синонимы. Но экземпляр класса это не класс. Хинтить функцию, которая принимает экземпляр класса, я умею. Хинтить функцию, которая принимает сам класс, не умею.

    Расшифруйте, что вы понимаете под хинтингом для класса

    Функция принимает аргументом класс, а не объект класса. Я уже не знаю, куда дальше расшифровывать, могу только объяснить, чем класс отличается от объекта.
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    bbkmzzzz,
    нужно было написать, что для 2.7 версии

    я и написал python2, нужно было прочитать

    Используйте docstring annotation

    вы привели пример аннотации экземпляра класса, а не самого класса. В самом вопросе я и это тоже сразу обозначил, что мне нужен хинтинг не экземпляра, а самого класса.
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    Читайте: Как сделать, чтобы он появился.

    А зачем?

    Как я уже писал:
    Можно конечно подавить ошибку ImportError, но если так ради хинтинга pycharm импортировать все подряд, всплывут цикличные импорты, и программа опять таки не запустится.
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    Andy_U, к сожалению в python2 нет модуля typing, программа не запустится, но за то хинтинг будет работать. Можно конечно подавить ошибку ImportError, но если так ради хинтинга pycharm импортировать все подряд, всплывут цикличные импорты, и программа опять таки не запустится.
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    Andy_U, да, именно, мне нужен класс, а не экземпляр. Поэтому я дважды на этом заострил внимание.

    Метод с Type[Base] я кстати тоже пробовал, но у меня ни индикации ошибки нет, ни верного выпадающего меню. Pycharm в меню подсовывает атрибуты того класса, который я ниже ему передаю при вызове (атрибуты класса NotSubclass), что говорит о том, что тайп хинтинг в этом случае не работает. То есть, если вообще не вызывать функцию, то он и в меню ничего не подставит. А если вызвать функцию 4 раза (на каждый класс), подставит все 4 поля в меню.
    5d128620db5cc929300800.png
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    Либо я неправильно понял ответ, либо вы неправильно поняли вопрос. Я спрашивал про хинтинг классов, а вы продемонстрировали хинтинг экземпляров классов, с которым у меня проблем нет.
  • Как в PyCharm сделать Type Hinting классов?

    @AlexBin Автор вопроса
    если я правильно понял, что имеется в виду

    К сожалению, неправильно, но спасибо за попытку. Вы перепутали "аннотации типов Python3" с "Type Hinting в PyCharm для python2". PyCharm это IDE для питона от JetBrains (IDEA). Дело в том, что в python2 нет аннотации типов, и поэтому в PyCharm используется тайп хинтинг, который предоставляет некоторые возможности для статического анализа и предотвращения ошибок при разработке.