Python 启用mypy`strict\u选项有什么好处?

Python 启用mypy`strict\u选项有什么好处?,python,typing,mypy,Python,Typing,Mypy,您认为启用该选项有什么好处吗?现在它在默认情况下被禁用,我看不到签名可读性或其他任何方面的任何好处。好吧,任何类型的严格类型检查都有它的好处。我总是启用此检查并使用可选[T]注释注释任何可以接受None的变量,因为这使mypy能够捕获丢失的空检查并防止讨厌的'NoneType'对象没有属性运行时错误 然而,我也理解为什么人们不想启用它。相当多的代码广泛地利用了Python的动态特性,并且对它们进行注释会很乏味。有些人可能也不喜欢编写冗长的Optional[]。对我来说,支票的好处大于细微差别,但

您认为启用该选项有什么好处吗?现在它在默认情况下被禁用,我看不到签名可读性或其他任何方面的任何好处。

好吧,任何类型的严格类型检查都有它的好处。我总是启用此检查并使用
可选[T]
注释注释任何可以接受
None
的变量,因为这使
mypy
能够捕获丢失的空检查并防止讨厌的
'NoneType'对象没有属性
运行时错误

然而,我也理解为什么人们不想启用它。相当多的代码广泛地利用了Python的动态特性,并且对它们进行注释会很乏味。有些人可能也不喜欢编写冗长的
Optional[]
。对我来说,支票的好处大于细微差别,但你的里程数可能会有所不同


由于Python类型注释的目的是“逐步类型化”,这意味着类型不是必需的,您可以对代码进行部分注释,没有太严格的默认设置可能有助于采用此类工具。

任何类型的严格类型检查都有其好处。我总是启用此检查并使用
可选[T]
注释注释任何可以接受
None
的变量,因为这使
mypy
能够捕获丢失的空检查并防止讨厌的
'NoneType'对象没有属性
运行时错误

然而,我也理解为什么人们不想启用它。相当多的代码广泛地利用了Python的动态特性,并且对它们进行注释会很乏味。有些人可能也不喜欢编写冗长的
Optional[]
。对我来说,支票的好处大于细微差别,但你的里程数可能会有所不同


由于Python类型注释的目的是“逐渐类型化”,这意味着不需要类型,您可以对代码进行部分注释,没有太严格的默认设置可能有助于采用此类工具。

您能给我一个例子,说明如何获得
“NoneType”对象没有属性的错误吗?@imbolc很抱歉造成混淆。我的意思是,这个检查可以帮助您捕获与变量相关的潜在bug,这些变量可能是
None
。可空变量的一个常见问题是,您忘记检查它是否为
None
,而只是继续访问它的属性,从而得到我提到的错误。启用检查后,
mypy
将在您尝试访问一个可能的
None
变量的属性时向您发出警告,而没有显式的
非None
检查。如果您只分配
None
而没有显式地将其包装到
可选项中,我发现了相同的行为。例如linting此函数:
def(x:int=None):返回x+1
生成
foo.py:2:错误:不支持+(“None”和“int”)foo.py:2的操作数类型:注意:左操作数的类型为“可选[int]”
。如果我把
int
包装成
Optional
,它会给出相同的结果。我不知道,这很好!似乎
mypy
引入了
--implicit optional
标志,该标志自动为默认值为
None
的参数添加
optional
,但它仅适用于参数,而不适用于变量或类属性。为了清晰起见,我个人还是更喜欢显式地注释
可选的
,但这只是一种风格上的偏好。你能给我一个例子吗?你是如何得到
'NoneType'对象没有属性的
错误的?@imbolc很抱歉混淆了。我的意思是,这个检查可以帮助您捕获与变量相关的潜在bug,这些变量可能是
None
。可空变量的一个常见问题是,您忘记检查它是否为
None
,而只是继续访问它的属性,从而得到我提到的错误。启用检查后,
mypy
将在您尝试访问一个可能的
None
变量的属性时向您发出警告,而没有显式的
非None
检查。如果您只分配
None
而没有显式地将其包装到
可选项中,我发现了相同的行为。例如linting此函数:
def(x:int=None):返回x+1
生成
foo.py:2:错误:不支持+(“None”和“int”)foo.py:2的操作数类型:注意:左操作数的类型为“可选[int]”
。如果我把
int
包装成
Optional
,它会给出相同的结果。我不知道,这很好!似乎
mypy
引入了
--implicit optional
标志,该标志自动为默认值为
None
的参数添加
optional
,但它仅适用于参数,而不适用于变量或类属性。为了清晰起见,我个人还是更喜欢显式注释
可选的
,但这只是一种风格偏好。