Прототип numpy.histogram содержит входной аргумент density
типа bool
и значения по умолчанию None
. Если вызывающий абонент не передает density
, какое значение это принимает?
Ближайшие вопросы и ответы, которые я могу найти, это это . В первом ответе говорится: «Не используйте False
в качестве значения для поля, отличного от bool
», что здесь неприменимо. Там также сказано, что bool(x)
возвращает False
, но это не гарантирует вызывающему объекту, что функция установит density
в False
, если оно не предоставлено. Это ошибка в документации прототипа numpy.histogram
или я что-то упускаю из соглашения о документации?
Другие ответы на вопросы и ответы выше не имеют отношения к моему вопросу.
Помните, что Python не является строго типизированным. Эти подсказки типов не имеют никакого эффекта во время выполнения. Они предназначены только для редакторов и линтеров. Вы можете передать строку в качестве этого аргумента, и язык это позволит, хотя сама функция может возражать. Также помните, что КАЖДЫЙ объект в Python имеет логическое значение.
@TimRoberts Python строго типизирован. Я думаю, вы хотели вместо этого использовать слово «статический».
Установлено None
; тот факт, что явный аргумент должен быть логическим, не меняет этого.
@johrsharpe и Тим Робертс: Процитированные вопросы и ответы объясняют, что такое ложь, но является ли установленным соглашением, что логические аргументы со значением по умолчанию None
всегда будут устанавливаться в соответствии с их истинностью и ложностью, а не какой-либо другой схемой, которая кажется логичной? разработчик? Спасибо за напоминание о том, что подсказки типов — это предложения, но это вопрос соглашения. Могу ли я ожидать, что входные аргументы, задокументированные как bool
, перед использованием претерпят истинное/ложное преобразование. Я пытаюсь исключить домашнее преобразование в bool
при просмотре документации в целом.
@chepner: «Установлено значение None; тот факт, что явный аргумент должен быть логическим, этого не меняет». Итак, мы либо «предполагаем», что переменная установлена в соответствии с истинностью/ложностью, либо углубляемся в код для подтверждения? Не существует установленного соглашения относительно намерения?
Я не совсем уверен, чего вы здесь ожидаете. Из объявления мы знаем, что параметр будет использоваться в логическом контексте. Значение по умолчанию None
имеет четко определенное значение при использовании в логическом контексте. Никакого «конвертирования» не требуется.
Из исходного кода метода мы видим, что аргумент density
используется только в конце метода в инструкции if
.
В Python None
интерпретируется как False
(это ложное значение). Это означает, что предоставление None
аргументу numpy.histogram
density
эквивалентно предоставлению ему False
.
Полагаю, что разработчики сочли более уместным использовать None
вместо False
для значения, которое не было определено пользователем.
Спасибо за источник. Я добавил комментарий к своему вопросу, чтобы уточнить, что я спрашиваю о том, является ли это установленным соглашением, на которое я могу полагаться при просмотре документации в целом, т. е. документированный аргумент типа bool
будет подвергаться преобразованию истинности/ложности, а не некоторому другая схема преобразования, которая может иметь смысл для разработчика и в значительной степени вести себя как истинность/ложность (за исключением крайних случаев).
Я почти уверен, что это не устоявшаяся конвенция. Я углубился в исходный код и обнаружил, что раньше наряду с аргументом density
существовал нормированный аргумент.
Аргумент normed
был признан устаревшим и в конечном итоге заменен на density
, но какое-то время они сосуществовали. Они использовали значение по умолчанию None
, чтобы узнать, указан ли один из двух аргументов пользователем, а другой нет. Посмотреть, как это было сделано, можно здесь. Таким образом, значение None
по умолчанию, похоже, обусловлено историческими причинами и, вероятно, его следует заменить на False
...
Спасибо за объяснение этой странности!
Это в лучшем случае плохо документировано. Судя по всему, документация подразумевает, что False
и значение по умолчанию None
будут рассматриваться одинаково, но следует либо задокументировать это явно, либо использовать более разумное False
в качестве значения по умолчанию. (Третий вариант — если функция проводит различие между False
и None
, но это также должно быть явно задокументировано.)
Спасибо, Чепнер. Похоже, что не существует установленного соглашения о том, что документированный аргумент bool
со значением по умолчанию None
будет преобразован в False. Предполагаем это на свой страх и риск или погружаемся в код для подтверждения. Я подожду немного, прежде чем отметить это как ответ.
Такого соглашения не существует, потому что было бы разумно провести трехстороннее различие между True
, False
и None
.
...он принимает значение
None
, значение по умолчанию. Это тоже ложь; оно используется только здесь.