如何键入注释将 envvar 转换为整数?

问题描述 投票:0回答:1

我如何让 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]

python mypy
1个回答
0
投票

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 是表达“如果未设置,则将其视为零”的更清晰/惯用的方式。)

© www.soinside.com 2019 - 2024. All rights reserved.