Python "См. Помощь (тип (self)) для точной подписи." - PullRequest
0 голосов
/ 09 января 2019

Я видел следующее утверждение в ряде строк документации при help() использовании класса: «См. help(type(self)) для точной подписи.»

Примечательно, что это help() для scipy.stats.binom.__init__ и stockfish.Stockfish.__init__ как минимум. Поэтому я предполагаю, что это какое-то сообщение со склада.

В любом случае, я не могу понять, какого черта это значит. Это полезная информация? Обратите внимание, что, будучи, так сказать, «вне» класса, я никогда не имею доступа к self Кроме того, невозможно создать экземпляр класса, если я не могу получить доступ к сигнатуре __init__ метода и, следовательно, даже не могу help(type(my_object_instantiated)). Это ловушка 22. Чтобы использовать __init__, мне нужна подпись для __init__, но чтобы прочитать подпись для __init__, мне нужно создать экземпляр объекта с помощью __init__. Однако этот пункт является строго академическим, поскольку даже когда мне удается создать экземпляр scipy.stats.binom, он на самом деле возвращает объект совершенно другого класса rv_frozen с точно таким же сообщением в его __init__ docstring, но чья подпись совершенно другая и совершенно менее полезная. Другими словами, help(type(self)) на самом деле не дает точной подписи. Это бесполезно.

Кто-нибудь знает, откуда пришло это сообщение или что я должен из него сделать? Это просто мусор из генератора документации или я ошибаюсь?

1 Ответ

0 голосов
/ 28 марта 2019

Существует соглашение, что подпись для создания экземпляра класса помещается в __doc__ в class (поскольку это то, что пользователь вызывает), а не в __init__ (или * 1005). *) которая определяет эту подпись. Это особенно верно для типов расширений (написанных на C), чья __init__ не может иметь свою сигнатуру, обнаруженную посредством самоанализа.

Сообщение, которое вы видите, является частью класса type (см. help(type.__init__)) и, таким образом, по умолчанию наследуется метаклассами.

В некоторых версиях scipy.stats.binom путает вопрос, фактически не являясь типом; это просто экземпляр другого класса, который (например, type) может быть вызван. Поэтому запрос help на него просто дает справку для этого класса (точно так же, как help(1) получает вас help(int)) - вы должны взглянуть на его __call__ для получения дополнительной информации (если есть) , И запрос help в результате вызова дает вам помощь для фактического класса того, что он возвращает, как вы заметили.

...