Вы получаете ошибку, потому что в строке:
default = (os.cpu_count() if os.cpu_count() is not None else 1.0) * 1.2
mypy
не может сказать, что второй вызов будет таким же, как второй ... поэтому он не может сделать вывод, что Второй звонок не будет None
. Кроме того, несколько глупо вызывать эту функцию дважды (представьте, если бы эта функция выполняла много работы и занимала много времени, было бы нежелательно использовать шаблон, который вы использовали). Таким образом, должны быть более эффективные способы express.
Я считаю, что самым чистым и простым решением является использование вспомогательной переменной для значения, возвращаемого os.cpu_count()
:
nb_cpus = os.cpu_count() # type: Optional[int]
default = (nb_cpus if nb_cpus is not None else 1) * 1.2 # type: float
Следующее может выглядеть более Pythoni c (дано в комментарии hoefling):
default = (os.cpu_count() or 1) * 1.2
Это здорово, но имейте в виду, что это не совсем семантически эквивалентно тому, что вы делаете: значение (os.cpu_count() or 1)
будет 1
, если os.cpu_count()
тоже равно 0
. Это, вероятно, не проблема с os.cpu_count()
, поскольку он не должен возвращать 0
, но помните об этом семантичном c разнице, когда вы используете такие «горячие клавиши» (такие ярлыки всегда выглядят круто, но вы должны понимать, их реальное значение, прежде чем использовать их).