Путаница в типах Pylint

#python #pylint

#python #pylint

Вопрос:

 user = get_user() # returns object of type User or False
if not user:
  raise HTTPException()
print(user.name) # pylint error: Instance of 'bool' has no 'name' member
 

Цель: избавиться от ошибки pylint в последней строке.

Я попытался использовать возвращаемый тип Union[bool, User] для get_user() , но это не решило проблему.

Каков pythonic способ «приведения» типа из bool в User?

Комментарии:

1. Пожалуйста, обратите внимание, что ответы не должны быть в вопросах — вы можете опубликовать ответ ниже или просто удалить вопрос. Но да, я бы сказал None , что это возвращаемое значение pythonic для отсутствующего пользователя; недостатком Union[bool, User] является то, что if not user только исключает False , а не True .

Ответ №1:

Изменение возвращаемого типа get_user() функции на typing.Optional[User] решает проблему.

pylint жалуется, потому что, согласно только подсказке типа, user может быть значением True и True.name вызывать исключение. pylint не оценивает путь к коду (он не знает, get_user() возвращает ли только False , нет True ; он просто знает, что он должен возвращать bool .)

Комментарии:

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