Python 我如何避免;“不可下标”;当我稍后设置变量值时,是否从Pylint进行类型检查?

Python 我如何避免;“不可下标”;当我稍后设置变量值时,是否从Pylint进行类型检查?,python,pylint,type-hinting,Python,Pylint,Type Hinting,我有一些python代码,我正试图键入提示PEP484样式,并得到虚假的警告 通过循环,我首先将最后一行初始化为无。 第一次我给它一个值,然后下次我用它做点什么。 然而,Pylint仍然认为它是None,即使我将类型声明为Dict 如何避免这种情况 我想在初始化上加上一些值,而不是None,只是为了关闭linter,但这看起来像是一个黑客 最后一行:Dict={} 也许linter指向一个代码气味,我应该修正它,使最后一行的类型/值更加一致 last_row: Dict = No

我有一些python代码,我正试图键入提示PEP484样式,并得到虚假的警告

通过循环,我首先将
最后一行
初始化为无。 第一次我给它一个值,然后下次我用它做点什么。 然而,Pylint仍然认为它是
None
,即使我将类型声明为
Dict

如何避免这种情况

我想在初始化上加上一些值,而不是
None
,只是为了关闭linter,但这看起来像是一个黑客

最后一行:Dict={}

也许linter指向一个代码气味,我应该修正它,使
最后一行的类型/值更加一致

        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
在上面的代码中,我得到了以下错误:

值“最后一行”不可订阅

我相信typescript检查器在这类事情上更聪明,但它正在进行运行时猜测,因此感觉也有点脆弱。

Answer for python 3.9 从Python3.9开始,不推荐使用typing.Dict。 不推荐typing.Dict的原因是类现在支持类型注释的方括号。现在,内置类被认为是泛型

发件人:


在Python3.9中不推荐使用第二个示例的情况下,一个选项是将类型提示定义为Dict和None的并集,但是,这会有不同的问题。它不能保证它是可订阅的

问题是
None
不是dictionary类型,因此
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


Python mypy checker支持参数,当在
mypy.ini
中设置为
strict\u optional=False
时,该参数将把
optional[Dict]
视为
Dict
。默认情况下,它设置为
True
。同样,通过将
--无严格可选的
作为命令行标志传递,也可以实现相同的功能

例如:

d: dict[str, str] = None
默认mypy输出

error: Incompatible types in assignment (expression has type "None",
variable has type "Dict[str, str]")
    d: dict[str, str] = None
$mypy --no-strict-optional filename.py
Success: no issues found in 1 source file
使用
--无严格的可选设置

Mypy输出

error: Incompatible types in assignment (expression has type "None",
variable has type "Dict[str, str]")
    d: dict[str, str] = None
$mypy --no-strict-optional filename.py
Success: no issues found in 1 source file

“X和无的联合”写得更好,因为这是一个选项。。。但是它看起来更像是运行时类型检查,所以它有点违背了目的。它确实会使类型检查器静音,尽管这是真的。如果您只想检查是否为空,也可以使用“if last_row:”。记住,这是不推荐的()。如果您要回答的是Python的旧版本,那么您可能应该明确地提到这一点。