我如何让 mypy 接受这个代码?
try:
DEBUG = int(os.getenv("DEBUG")) > 0
except ValueError:
DEBUG = False
当前诊断为
mypy: Argument 1 to "int" has incompatible type "str | None"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type]
mypy 警告您的问题是,如果
TypeError
返回 os.getenv
,您的代码将引发 None
。
我可能会写成:
try:
DEBUG = int(os.getenv("DEBUG") or 0) > 0
except ValueError:
DEBUG = False
假设您希望将
$DEBUG
视为默认为零(关闭)。 or 0
意味着如果 os.getenv
返回错误值(即 None
或 ''
),则表达式将采用值 0,这是 int()
的有效参数,并且将导致 DEBUG = False
.
你也可以这样做:
try:
debug_var = os.getenv("DEBUG")
if debug_var is None:
raise ValueError
DEBUG = int(debug_var) > 0
except ValueError:
DEBUG = False
在此版本的代码中,
debug_var
以类型str | None
开始,if debug_var is None: raise ...
导致其类型在该块的其余部分缩小为str
。这是缩小联合类型范围的更通用的方法。 (但同样,在这种情况下,我会选择第一个选项 - 它更简洁,并且 IMO 是表达“如果未设置,则将其视为零”的更清晰/惯用的方式。)