Я понимаю, что для параметра Dict в функции Python лучше всего установить значение по умолчанию None. Однако mypy, похоже, не согласен:
def example(self, mydict: Dict[int, str] = None):
return mydict.get(1)
Это приводит к ошибке mypy:
error: Incompatible default for argument "synonyms" (default has type "None", argument has type "Dict[Any, Any]") [assignment]
mypy, с другой стороны, отлично справляется с этим:
def example(self, myDict: Dict[int, str] = {}):
Но пилинт жалуется:
W0102: Dangerous default value {} as argument (dangerous-default-value)
В соответствии с этим вопросом SO (https://stackoverflow.com/a/26320917) по умолчанию должно быть None, но это не будет работать с mypy. Какой вариант удовлетворит и pylint, и mypy? Спасибо.
РЕШЕНИЕ (на основе комментариев):
class Example:
"""Example"""
def __init__(self):
self.d: Optional[Dict[int, str]] = None
def example(self, mydict: Optional[Dict[int, str]] = None):
"""example"""
self.d = mydict
Часть проблемы (первоначально не упомянутой), которую я имел, заключалась в том, чтобы присвоить ранее инициированную переменную, это работает.
Кстати, решения помещаются в поля для ответов, а не в качестве дополнения к вопросу - таким образом люди могут голосовать за него или против него.
Я думаю, что тип должен быть "dict
или None
", поэтому Union
из двух:
def example(self, mydict: Union[Dict[int, str], None] = None):
return mydict.get(1)
Или сокращенно Optional[Dict[int, str]]
Спасибо, они работают для меня. Это ближе к моему реальному коду, но эти предложения сработали, см. обновленный пост.
@Дюны или даже короче dict[int, str] | None
(при условии версий)
Примечание: если
mydict
равноNone
, тоmydict.get(1)
приведет к ошибке типа. Может быть, вы хотите что-то вродеreturn mydict.get(1) if mydict is not None else None
. Или, учитывая ваше использованиеmydict
только для чтения, вы можете указать pylint игнорировать это предупреждение в этой функции.