Как ввести инициализаторы списка по умолчанию в функции - PullRequest
2 голосов
/ 16 июня 2019

У меня есть следующая функция

def foo(main_list = None):
    if main_list is None:
        main_list = []

    # do stuff with main_list

Это общая парадигма Python , потому что если у вас есть список по умолчанию, этот список остается неизменным для всех вызовов по умолчанию. Таким образом, вы можете обойти это, установив значение None, а затем сбросив его до фактического списка по умолчанию внутри функции.

При наборе этого я хотел бы сделать:

def foo(main_list: List[int] = None):
    if main_list is None:
        main_list = []

    # do stuff with main_list

Но Mypy жалуется, потому что теперь я храню None в List[int], что не правильно.

Должен ли я ...

  1. Марка main_list типа Optional[List[int]]

  2. Добавьте # type: ignore (который также удалит все наборы из других параметров, которые работают просто отлично)

  3. Какой-то другой лучший способ обойти это

(Я действительно надеюсь, что ответ # 3, поэтому я спрашиваю. Прямо сейчас в моем коде я выбрал вариант # 2.)

1 Ответ

1 голос
/ 16 июня 2019

Просто используйте Optional[List[int]]. Вы ничего не теряете, делая параметр необязательным - вы явно обрабатываете None в теле функции - поэтому нет причин не использовать правильный тип. Это Pythonic для обработки пустых списков и None одинаково в любом случае.

Проблема с # type: ignore, как вы упомянули, заключается в том, что она подавляет проверку типов для других параметров.

...