Ошибка при возбуждении ошибки в тернарном операторе Python
мой код, имеющий следующий вид возбуждает такую ошибку:
class Storage:
connection: MySQLConnection
cursor: MySQLCursor
def set_values(self, *, data: Dict[str, Any]) -> None:
self.connection = connect(**data)
self.cursor = self.connection.cursor()
def open_connection(self) -> None:
raise ValueError("The database settings must be filled in.") if not DATABASE \
else self.set_values(data=DATABASE)
def close_connection(self) -> None:
self.connection.close()
raise ValueError("The database settings must be filled in.") if not DATABASE \
TypeError: exceptions must derive from BaseException
Подскажите, пожалуйста, с чем бы это могло быть связано? Когда я вместо тернарного оператора пользуюсь обычным ифом все работает окей.
Ответы (1 шт):
Упрощу вариант, который воспроизводит вашу ошибку:
raise ValueError("Something bad") if False else None
Выходит:
TypeError: exceptions must derive from BaseException
Почему так? А просто потому, что читать надо так:
raise (ValueError("Something bad") if False else None)
Т.е. в обоих случаях срабатывает raise, но когда срабатывает с тем операндом, который в else, ему непонятно, как это интерпретировать как Exception.
Как заставить питон воспринимать raise и его аргумент как единую конструкцию в данном случае - я пока не нашёл и не знаю, возможно ли это. Если брать в круглые скобки (raise ValueError("Something bad")), интерпретатор ругается.
Видимо, поскольку raise это оператор, других вариантов нормально управлять его исполнением тут нет, кроме стандартной конструкции if в виде также оператора.