Дополнительно
Питон: как проверить необязательный параметр функции
Есть простой способ в Python, чтобы проверить, является ли значение необязательного параметра исходит из его значения по умолчанию, или потому, что пользователь установил его прямо на вызове функции?
67
9
Не правда. Стандартный способ-использовать значение по умолчанию, что пользователь не будет ожидать, чтобы пройти, например, "объект" экземпляр:
Обычно вы можете просто использовать " нет " в качестве значения по умолчанию, если это не'т иметь смысл как значение, которое пользователь захочет пройти.
Альтернативой является использование
kwargs
:Однако это чрезмерно многословен и делает вашу функцию более трудно использовать в качестве документации не будет автоматически включен параметр
парам
.Следующая функция-декоратор,
explicit_checker
, производит набор названий параметров всех параметров в явном виде. Он добавляет результат в качестве дополнительного параметра (explicit_params
) к функции. Просто сделать `'Это' в explicit_params, чтобы проверить, если параметр " а " в явном виде.Я иногда использую универсально уникальную строку (например, идентификатор UUID).
Таким образом, ни один пользователь не мог даже догадаться, по умолчанию, если они попробовали, поэтому я могу быть очень уверены в том, что когда я вижу, что значение
арг
, он не был принят.Много ответов есть маленькие кусочки полная информация, поэтому я'd, как, чтобы принести все это вместе с моим любимым рисунком(ы).
значение по умолчанию-это Мутабельный тип
Если значением по умолчанию является изменяемый объект, то вам повезло: вы можете воспользоваться тем, что аргументы по умолчанию в Python несколько раз, когда функция определена (подробнее об этом в конце ответа)
Это означает, что вы можете легко сравнить мутабельное значение по умолчанию с помощью "есть", чтобы увидеть, если он был передан в качестве аргумента или оставил по умолчанию, как показано в следующих примерах в качестве функции или метода:
и
Незыблемые аргументы по умолчанию
Теперь, это'немного менее элегантно, если по умолчанию предполагается,
неизменный
значение (и помните, что даже как строки являются неизменными!) потому что вы можете'т использовать трюк, как это, но вы все еще можете сделать что-то вроде:Он чувствует себя особенно смешно, если вы реально по умолчанию
нет
, ноникто
является неизменным, так что...Использование "по умолчанию" класс неизменяемых по умолчанию
или, аналогично @с-з предложение, если Python документов не хватает :-) , вы можете добавить объект между ними, чтобы сделать API более четко без чтения документации:
сейчас:
Выше прекрасно работает и по умолчанию(нет)`.
Другие модели
Вполне очевидно, что узор выглядит уродливее, чем они должны из-за всех "печать", которые существуют только для показа, как они работают. В противном случае я нахожу их достаточно лаконична и повторяемым.
Вы могли бы написать декоратора, чтобы добавить
__звоните__
картины полагают @DMG в более рациональный способ, но это по-прежнему обязаны использовать странные методы, представленные в функции определения себя - вы должны были бы разделитьзначение
иvalue_default
если код нужно их различать, так что я Дон'т см. Большое преимущество, и я выиграл'т писать например :-)Изменяемые типы значений по умолчанию
Немного больше о #1 питон попался!, использовался для собственных выше удовольствия. Вы можете увидеть, что происходит за счет evaluation на definition, выполнив:
Вы можете выполнить достижения этой цели()` столько времени, сколько вы хотите, вы всегда будете видеть ссылку на тот же экземпляр по умолчанию (так в основном по умолчанию является неизменным :-) ).
Помните, что в Python есть 3 изменяемых встроенные:
Набор
,список
,Словарь
, а все остальное - даже струны! - является неизменным.Я согласен с волатильностью'ы комментарий. Но можно проверить следующим образом:
Я'вэ видел этот шаблон несколько раз (например, в библиотеке
unittest
,пй-флаги
,святилище
):...или эквивалент один-лайнер...:
В отличие от
по умолчанию = объект()
, это помогает проверка типов и предоставляет информацию, когда возникают ошибки-часто либо строковое представление (в"по умолчанию"
В) или имя класса ("по умолчанию"
в) используются в сообщениях об ошибках.Вы можете проверить это с
Фу.__по умолчанию__
ифу.__kwdefaults__
смотри простой пример ниже
затем с помощью оператора
=
иэто
вы можете сравнить ихи для некоторых случаях код ниже, является достаточно
Например, вам нужно не менять значение по умолчанию, то можно проверить на равенство, а затем скопировать если так
@Ellioh'ы ответ работает в Python 2. В Python 3, следующий код должен работать:
Этот метод может сохранить имена аргументов и значений по умолчанию (вместо **kwargs) с лучшей читабельности.
Немного странный подход:
Выходы:
Теперь это, как я уже упоминал, довольно странно, но это делает работу. Однако это совершенно нечитабельна и аналогично ecatmur'ы suggestion выиграл'т быть автоматически документируются.