Python 3.4 Visual Studio PTVS Неправильный Intellisense

Я установил Visual Studio 2013 Community и инструменты Python для Visual Studio 2.1 с Python 3.4.2 на Windows Server 2012. Похоже, intellisense работает неправильно

import gspread
import requests
import json

# correctly calls gc a 'client' type
gc = gspread.login('<user_name redacted>','<password redacted>')
# correctly calls wks a 'Worksheet' type
wks = gc.open('testing_sheet').sheet1

# INCORRECTLY calls the json_test object a 'boolean, NoneType, float, int, object' type
json_test = json.loads('{"chicken":"cluck"}')

# correctly calls post_data a 'dict' type
post_data = {'item':'abc'}
# correctly calls post_headers a 'dict' type
post_headers = {'content-encoding': 'json'}
# INCORRECTLY calls post_requests a 'bool' type, should be type 'Response'
post_requests = requests.post(url = '<redacted>', data = json.dumps(post_data), headers = post_headers)

Я несколько раз пробовал пересобирать БД, удалял и переустанавливал Python и PTVS, но он всегда неправильно идентифицировал эти объекты. Я делаю что-то неправильно? Есть ли что-то еще, что я могу сделать?


person Matthew Crews    schedule 19.11.2014    source источник


Ответы (1)


IntelliSense в PTVS управляется механизмом вывода типов. Поскольку сам Python, в конечном счете, является языком с динамической типизацией, он может делать только некоторые вещи и должен делать предположения и догадки о том, что происходит. Например, в случае json.loads он просматривает код, анализирует все возможные пути кода через него и создает объединение типов, которые могут быть получены из каждого. Итак, если json.loads может возвращать логическое значение для некоторого ввода (а это возможно, если сам ввод является логическим литералом), то этот тип будет указан в возвращаемых типах. Затем список завершения будет включать элементы всех типов в объединении, причем каждый член будет помечен именем типа, из которого он произошел.

(Причина, по которой object появляется в списке, я полагаю, из-за обратного вызова object_hook, который позволяет в значительной степени произвольное декодирование JSON.)

Одна вещь, которую он не делает, — это попытка запустить код, чтобы увидеть, как будет проанализирована строка, в которую вы его передадите. Так что не ожидайте увидеть здесь конкретный словарь с «курицей» и т. д. в IntelliSense.

Однако завершение для requests выглядит неправильно. Я бы посоветовал сообщить об ошибке.

person Pavel Minaev    schedule 19.11.2014
comment
Я понимаю, что json.loads не является детерминированным в отношении создаваемого типа, поэтому синтаксический анализатор не может его вывести. Однако ошибка requests, безусловно, является ошибкой. - person Matthew Crews; 19.11.2014