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
,但它仅适用于参数,而不适用于变量或类属性。为了清晰起见,我个人还是更喜欢显式注释可选的,但这只是一种风格偏好。