Как указать класс или тип функции в docstring для парсера PyCharm

Я использую много парсера типа Pycharm docstring, чтобы указать типы параметров методов и return, атрибуты или переменную экземпляра. Если он работает почти все время, у меня есть небольшая проблема с сообщением PyCharm. Я предоставляю функцию или класс как параметр / атрибут / …

Вот краткий пример:

class Bar: def __init__(self, bar): """ :type bar: str """ print bar class Foo: """ :type my_class: Bar.__class__ """ def __init__(self, cinstance=Bar): """ :type cinstance: Bar.__class__ """ self.my_class = cinstance def run(self): # it should print an unexpected type warning, but it doesn't. self.my_class(2) 

Если я просто ставлю Bar вместо Bar.__class__ , конечно, PyCharm скажет мне, что Bar нельзя позвонить. Итак, как сказать ему, что я даю ему класс?

Обратите внимание, что с @classmethod декоратора @classmethod PyCharm нет проблем, чтобы понять, что мы говорим о классе, а не экземпляре.

Вот мои попытки:

Попытка с помощью <code> Bar .__ name __ </ code>

Попытка с помощью <code> Bar .__ class __ </ code>

Попытка с помощью <code> Bar </ code>

3 Solutions collect form web for “Как указать класс или тип функции в docstring для парсера PyCharm”

Поддержка PyCharm сказала мне следующее:

Как сказал разработчик PyCharm: Вы не можете различать классы и экземпляры в типах. Имя класса в подсказке типа означает, что ожидается экземпляр этого класса. Если ваша функция принимает сам класс, ваши параметры либо не будут использовать подсказки типа вообще, либо использовать «тип» в качестве имени класса. Во всяком случае, в этих случаях не будет никакого полезного завершения кода. См. Также https://youtrack.jetbrains.com/issue/PY-11615 .

Единственный способ специфицировать аргумент – это использовать класс :type arg: type , но выполнение не будет работать. В настоящее время нет другого способа.

Если вы хотите указать, что параметр имеет тип SomeClass , он должен быть объявлен как таковой:

 @type (param): SomeClass 

Правильно указав, вы должны получить что-то вроде этого:

часть 1

Если вы не укажете тип параметра правильно:

часть 2

В этот момент я подумал, что буду копать немного глубже, чтобы увидеть, могу ли я найти что-нибудь интересное. Если вы перейдете к объявлению объекта .__class__ , вы будете .__class__ сюда (в builtins.py ):

часть 3

Возможно, для __class__ установлено значение None ? Даже если он по умолчанию, но затем обновляется, когда класс получает экземпляр (что будет моим догадком о том, что происходит), это может быть то, что разрешает PyCharm __class__ . Все это только предположение на моем конце и может быть неправильным, но … Как раз для этого, какое поведение мы можем увидеть, если мы зададим тип параметра None , то?

часть 4

Похоже на то, что произошло, когда мы задали тип SomeClass.__fake__ (и я тестировал его с помощью SomeClass.__class__ , и там тоже происходит.)

Поэтому я полагаю, что вопрос в том, почему вы не можете использовать @type cinstance: Bar ?

Для функций, определяющих использование callable работ с PyCharm.

  • Ошибка Python XVFB в окнах
  • Сравнение первого элемента последовательных списков кортежей в Python
  • KeyError при доступе к словарю?
  • Ошибка Dateutil parse в python возвращает неверное значение
  • AttributeError: объект 'tuple' не имеет атрибута
  • Есть ли способ доступа к знаменателю доли в Python 2
  • Как манипулировать выражениями в матрицах с помощью sympy?
  • Избегайте вставки дубликатов в список Python с пониманием
  • python 2.7 эквивалент встроенного метода int.from_bytes
  • Ошибка Python DistributionNotFound после установки EB CLI 3.0
  • Что эквивалентно функциям python any () и all () в JavaScript?
  • Python - лучший язык программирования в мире.