Указать «Нет» в качестве значения по умолчанию для аргумента логической функции?

Прототип numpy.histogram содержит входной аргумент density типа bool и значения по умолчанию None. Если вызывающий абонент не передает density, какое значение это принимает?

Ближайшие вопросы и ответы, которые я могу найти, это это . В первом ответе говорится: «Не используйте False в качестве значения для поля, отличного от bool», что здесь неприменимо. Там также сказано, что bool(x) возвращает False, но это не гарантирует вызывающему объекту, что функция установит density в False, если оно не предоставлено. Это ошибка в документации прототипа numpy.histogram или я что-то упускаю из соглашения о документации?

Другие ответы на вопросы и ответы выше не имеют отношения к моему вопросу.

...он принимает значение None, значение по умолчанию. Это тоже ложь; оно используется только здесь.

jonrsharpe 08.07.2024 20:47

Помните, что Python не является строго типизированным. Эти подсказки типов не имеют никакого эффекта во время выполнения. Они предназначены только для редакторов и линтеров. Вы можете передать строку в качестве этого аргумента, и язык это позволит, хотя сама функция может возражать. Также помните, что КАЖДЫЙ объект в Python имеет логическое значение.

Tim Roberts 08.07.2024 20:51

@TimRoberts Python строго типизирован. Я думаю, вы хотели вместо этого использовать слово «статический».

S.B 08.07.2024 20:57

Установлено None; тот факт, что явный аргумент должен быть логическим, не меняет этого.

chepner 08.07.2024 20:59

@johrsharpe и Тим Робертс: Процитированные вопросы и ответы объясняют, что такое ложь, но является ли установленным соглашением, что логические аргументы со значением по умолчанию None всегда будут устанавливаться в соответствии с их истинностью и ложностью, а не какой-либо другой схемой, которая кажется логичной? разработчик? Спасибо за напоминание о том, что подсказки типов — это предложения, но это вопрос соглашения. Могу ли я ожидать, что входные аргументы, задокументированные как bool, перед использованием претерпят истинное/ложное преобразование. Я пытаюсь исключить домашнее преобразование в bool при просмотре документации в целом.

user2153235 08.07.2024 21:01

@chepner: «Установлено значение None; тот факт, что явный аргумент должен быть логическим, этого не меняет». Итак, мы либо «предполагаем», что переменная установлена ​​в соответствии с истинностью/ложностью, либо углубляемся в код для подтверждения? Не существует установленного соглашения относительно намерения?

user2153235 08.07.2024 21:13

Я не совсем уверен, чего вы здесь ожидаете. Из объявления мы знаем, что параметр будет использоваться в логическом контексте. Значение по умолчанию None имеет четко определенное значение при использовании в логическом контексте. Никакого «конвертирования» не требуется.

Tim Roberts 09.07.2024 05:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
7
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из исходного кода метода мы видим, что аргумент density используется только в конце метода в инструкции if.

В Python None интерпретируется как False (это ложное значение). Это означает, что предоставление None аргументу numpy.histogramdensity эквивалентно предоставлению ему False.

Полагаю, что разработчики сочли более уместным использовать None вместо False для значения, которое не было определено пользователем.

Спасибо за источник. Я добавил комментарий к своему вопросу, чтобы уточнить, что я спрашиваю о том, является ли это установленным соглашением, на которое я могу полагаться при просмотре документации в целом, т. е. документированный аргумент типа bool будет подвергаться преобразованию истинности/ложности, а не некоторому другая схема преобразования, которая может иметь смысл для разработчика и в значительной степени вести себя как истинность/ложность (за исключением крайних случаев).

user2153235 08.07.2024 21:08

Я почти уверен, что это не устоявшаяся конвенция. Я углубился в исходный код и обнаружил, что раньше наряду с аргументом density существовал нормированный аргумент.

TrickyTroll 08.07.2024 21:24

Аргумент normed был признан устаревшим и в конечном итоге заменен на density, но какое-то время они сосуществовали. Они использовали значение по умолчанию None, чтобы узнать, указан ли один из двух аргументов пользователем, а другой нет. Посмотреть, как это было сделано, можно здесь. Таким образом, значение None по умолчанию, похоже, обусловлено историческими причинами и, вероятно, его следует заменить на False...

TrickyTroll 08.07.2024 21:30

Спасибо за объяснение этой странности!

user2153235 08.07.2024 21:42
Ответ принят как подходящий

Это в лучшем случае плохо документировано. Судя по всему, документация подразумевает, что False и значение по умолчанию None будут рассматриваться одинаково, но следует либо задокументировать это явно, либо использовать более разумное False в качестве значения по умолчанию. (Третий вариант — если функция проводит различие между False и None, но это также должно быть явно задокументировано.)

Спасибо, Чепнер. Похоже, что не существует установленного соглашения о том, что документированный аргумент bool со значением по умолчанию None будет преобразован в False. Предполагаем это на свой страх и риск или погружаемся в код для подтверждения. Я подожду немного, прежде чем отметить это как ответ.

user2153235 08.07.2024 21:14

Такого соглашения не существует, потому что было бы разумно провести трехстороннее различие между True, False и None.

chepner 08.07.2024 21:39

Другие вопросы по теме