Как вводить изменяемые аргументы по умолчаниюPython

Программы на Python
Ответить
Anonymous
 Как вводить изменяемые аргументы по умолчанию

Сообщение Anonymous »

Чтобы справиться с изменяемыми аргументами по умолчанию в Python, необходимо установить для них значение None.
Например:

Код: Выделить всё

def foo(bar=None):
bar = [] if bar is None else bar
return sorted(bar)
Если я ввожу определение функции, то единственный тип для bar говорит, что bar является необязательным, тогда как очевидно, что он не является необязательным к тому времени, когда я планирую запустить на нем эту отсортированную функцию:

Код: Выделить всё

def foo(bar: Optional[List[int]]=None):
bar = [] if bar is None else bar
return sorted(bar) # bar cannot be `None` here
Итак, следует ли мне применить кастинг?

Код: Выделить всё

def foo(bar: Optional[List[int]]=None):
bar = [] if bar is None else bar
bar = cast(List[int], bar) # make it explicit that `bar` cannot be `None`
return sorted(bar)
Должен ли я просто надеяться, что тот, кто читает функцию, увидит стандартный шаблон работы с изменяемыми аргументами по умолчанию и поймет, что для остальной части функции аргумент не должен быть необязательным?
Как лучше всего с этим справиться?
РЕДАКТИРОВАТЬ:
Чтобы уточнить, пользователь этой функции должна иметь возможность вызывать foo как foo() и foo(None) и foo(bar=None). (Я не думаю, что имеет смысл делать это по-другому.)
РЕДАКТИРОВАНИЕ №2:
Mypy будет работать без ошибок, если вы никогда не вводите bar как Необязательный и вместо этого введите его только как List[int], несмотря на то, что значение по умолчанию — None. Однако это крайне не рекомендуется, поскольку такое поведение может измениться в будущем, а также неявно типизирует параметр как необязательный. (Подробнее см. здесь.)

Подробнее здесь: https://stackoverflow.com/questions/678 ... -arguments
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»