Pycharm: завершение кода не дает рекомендаций

Скажем, что я работаю с библиотекой python "запросы".

req = requests.get("http://google.com")

Теперь после этого, если я наберу req., я должен получить список всех методов, к которым я могу получить доступ. Но по какой-то причине я этого не делаю, даже если я вручную нажимаю ctrl-space.

Если я попробую это в ipython, я получу автозаполнение рекомендаций. Даже если я попробую его через встроенную консоль python в pycharm, я получаю рекомендации.

Почему это происходит?

Ответ 1

Поскольку Python является динамически типизированным языком, вы должны убедиться, что он может определить тип объектов и правильно проверить библиотеки в вашей системе. Постарайтесь, чтобы было очевидно, какой тип объекта в вашем коде.

Начиная с версии PyCharm 2.7 (когда версии были числами), можно включить обнаружение типов во время выполнения - PyCharm подключается к вашей программе во время ее выполнения (во время отладки) и проверяет типы переменных по мере их использования.

Вы можете включить это, перейдя в настройки, перейдя к разделу "Сборка, выполнение, развертывание", а затем к подразделу "Отладчик Python" и включив "Сбор информации о типах времени выполнения для понимания кода".

The settings screen of PyCharm open to show the relevant setting.

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

Вы также можете "сообщить" PyCharm, используя строки документов в стиле Epydoc или Sphinx, которые содержат информацию о параметрах и типах возвращаемых значений. PyCharm будет использовать их для улучшения проверок.

Python также получил поддержку аннотаций функций начиная с Python 3. Они могут использоваться для подсказок типов согласно PEP 484. Смотрите модуль typing для получения дополнительной информации. Это более формально, поэтому его также можно использовать для таких инструментов, как mypy, который является средством проверки типов, которое может программно проверять эти типы на согласованность, предоставляя Python необязательную статическую типизацию в стиле TypeScript.

Ответ 2

Python - это динамически типизированный язык, что означает, что функция "get" не объявляет свой возвращаемый тип. Когда вы вводите код в IPython или в консоли PyCharm, код фактически выполняется, и можно проверить экземпляр объекта в запущенном интерпретаторе и получить список его методов. Когда вы вводите код в PyCharm или любой другой Python IDE, он не выполняется, и только статический анализ можно использовать для вывода возвращаемого типа метода. Это невозможно во всех случаях.

Ответ 3

PyCharm понятия не имеет, что содержит dict, если вы заполняете его динамически. Таким образом, вы должны заранее сообщить PyCharm о ключах dict. Prodict делает именно это для подсказки PyCharm, поэтому вы получаете завершение кода.

Во-первых, если вы хотите иметь доступ к объекту ответа, вам нужно получить ответ json и преобразовать его в dict. Это достигается с помощью метода .json() из requests следующим образом:

response = requests.get("https://some.restservice.com/user/1").json()

Хорошо, мы загрузили его в объект dict, теперь вы можете получить доступ к ключам с синтаксисом в скобках:

print(response['name'])

Поскольку вы запрашиваете автоматическое завершение кода, вам, безусловно, нужно дать подсказку PyCharm о ключах dict. Если вы уже знаете схему ответа, вы можете использовать Prodict для подсказки PyCharm:

class Response(Prodict):
    name: str
    price: float

response_dict = requests.get("https://some.restservice.com/user/1").json()

response = Response.from_dict(response_dict)
print(response.name)
print(response.price)

В приведенном выше коде атрибуты name и price компилируются автоматически.

Если вы не знаете схему ответа, вы все равно можете использовать точечную нотацию для доступа к таким атрибутам dict, как этот:

response_dict = requests.get("https://some.restservice.com/user/1").json()
response = Prodict.from_dict(response_dict)
print(response.name)

Но завершение кода будет недоступно, поскольку PyCharm не может знать, что это за схема.

Более того, класс Prodict получен непосредственно из dict, поэтому вы можете использовать его и как dict.

Это скриншот из репозитория Prodict, который иллюстрирует завершение кода:

Prodict code completion

Отказ от ответственности: я автор Prodict.

Ответ 4

if просто обнаружит методы или переменные и... при этом напишет некоторую часть этого: File-> Настройка → Редактор → Общие → Завершение кода в верхней части открытого окна снимите галочку