PyCharm, что такое python_stubs?

У меня было много проблем с PyCharm, которые не распознавали функции в библиотеках должным образом, поэтому я решил изучить исходный код некоторых функций, которые PyCharm неправильно распознает. Например, PyCharm не распознает pickle.load() правильно; он считает, что pickle.load() не принимает никаких аргументов, когда на самом деле он принимает один аргумент. Я задал этот вопрос здесь. Поэтому я написал следующий короткий тестовый код.

import pickle


r = range(10)
f = open("../temp/pickling_example.pkl", "wb")
pickle.dump(r, f)
f.close()
f = open("../temp/pickling_example.pkl", "rb")
pickle.load(f)
print(r)

Я нажал Ctrl+B на pickle.load(f), предпоследнюю строку. Я надеялся, что это приведет меня к исходному файлу, содержащему определение pickle.load(), но вместо этого он привел меня в файл в месте C:\Users\ray\.PyCharm30\system\python_stubs\-1442825926\_pickle.py. Этот файл содержит следующий реферат (см. Снимок экрана ниже).

Здесь вы можете увидеть источник проблемы PyCharm, неправильно распознающий подпись pickle.load(); подпись pickle.load() в соответствии с этим файлом не имеет аргументов.

Может кто-нибудь объяснить, почему меня сюда привезли, и что это за файл, и что такое папка python_stubs (точнее, C:\Users\ray\.PyCharm30\system\python_stubs\)?

Мое предположение следующее. Я был доставлен в этот файл в этом месте, потому что PyCharm не может найти фактический исходный код, где pickle.load() был определен, на моем компьютере. В этих ситуациях PyCharm только генерирует фиктивный файл с только объявлениями (или только сигнатурами) используемых функций, в этом случае он pickle.load(). Этот файл находится там, где я был доставлен, когда я нажал Ctrl+B на pickle.load(). Цель этого файла сводится исключительно к тому, что проверки PyCharm работают правильно и могут обеспечивать автозаполнение, а PyCharm помещает все эти файлы в каталог python_stubs. Фактическое определение функции pickle.load() находится в файле pyc или pyd где-то в моем каталоге C:\Python34\, и у меня нет фактического файла py, содержащего определение pickle.load(), потому что, когда Я установил Python, я не установил исходные коды.

Вопросы:

(1) Насколько я понимаю, правильно? Не могли бы вы предоставить и более правильные и точные

(2) Что я могу сделать, чтобы PyCharm не ошибочно распознавал или не распознавал функции библиотеки? Должен ли я удостовериться, что я всегда устанавливаю исходные коды Python и всех сторонних пакетов, чтобы гарантировать, что PyCharm может делать свои проверки должным образом?

(3) Если бы я был прав в этом, PyCharm генерирует эти файлы, как PyCharm угадывает сигнатуры функций?

Ответ 1

(1) Да, вы в основном правы.

Файл python_stubs представляет собой автоматически сгенерированный файл, содержащий фиктивные определения для встроенных функций. Он используется PyCharm для вывода типов встроенных функций в случае, если они не были жестко запрограммированы для данной версии.

(3) Не всегда возможно правильно вывести тип встроенного функционала только из своих документов. Некоторые docstrings начинаются с "сигнатуры типа":

>>> print(min.__doc__)
min(iterable[, key=func]) -> value
min(a, b, c, ...[, key=func]) -> value

но pickle.load() не работает.

Обратите внимание, что это, вероятно, изменится в будущих версиях python, потому что, начиная с python3.4, была предложена отслеживании ошибок PyCharm.