首页 > 解决方案 > 当我稍后设置变量值时,如何避免来自 Pylint 的“不可下标”类型检查?

问题描述

我有一些 python 代码正在尝试输入提示 PEP484 样式,并收到虚假警告。

通过一个循环,我首先将 a 初始化last_row为 None。在第一次通过时,我给它一个值,然后下次我用它做一些事情。但是,None即使我将类型声明为Dict

如何最好地避免这种情况?

我想在初始化之外设置一些值只是None为了关闭 linter,但这似乎是一个 hack。

last_row: Dict = {}

也许 linter 指向代码异味,我应该解决这个问题,以便为last_row...提供更一致的类型/值

        last_row: Dict = None

        for index, row in self.df.iterrows():
            if last_row is not None:
                row['intent_from'] = str(last_row['intent'])
            last_row = row

在上面的代码中,我收到此错误:

Value 'last_row' is unsubscriptable

我相信打字稿检查器对这类事情更聪明,但它会在运行时猜测,所以感觉也有点脆弱。

标签: pythonpylinttype-hinting

解决方案


一种选择是将类型提示定义为 Dict 和 None 的并集,但是,这会产生不同的问题。它不能保证它是可下标的。

问题是它None不是字典类型,所以last_row: Dict = None是不正确的。

对此的解决方案可能是将字典初始化为空字典,然后在访问它之前检查该键是否存在。

last_row: Dict = {}

for index, row in self.df.iterrows():
    if 'intent' in last_row:
        row['intent_from'] = str(last_row['intent'])
    last_row = row


推荐阅读