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