bma*_*ies 5 python-3.x python-typing
两个python方法定义为:
def function() -> Optional[ast.Module]:
pass
def something(t: ast.Module) -> None:
pass
Run Code Online (Sandbox Code Playgroud)
在呼叫者中:
var = function()
if var:
do_something(var)
Run Code Online (Sandbox Code Playgroud)
类型检查器抱怨我无法将Optional[t]传递给t。我想象有某种铸造机制,但我没有想到。
准确地说,这是一个单元测试,如下所示:
self.assertIsNotNone(var)
do_something(var)
Run Code Online (Sandbox Code Playgroud)
关于可能重复的可选类型注释。检查是否为“无”后使用值?,
new_var: ast.Module = var
Run Code Online (Sandbox Code Playgroud)
得到相同类型的错误。
是否需要“如果”?
必须明确排除该值与 None 相同的情况,而不仅仅是任何 false\xe2\x80\x99y 值。
\nvar: Optional[...] = function()\nif var is not None: # reject None case in this branch\n do_something(var) # `var` is the unwrapped type\nRun Code Online (Sandbox Code Playgroud)\n反过来也是可能的:
\nvar: Optional[...] = function()\nif var is None: # handle None case in this branch\n ...\nelse: # no more None case in this branch\n do_something(var) # `var` is the unwrapped type\nRun Code Online (Sandbox Code Playgroud)\n请注意,类型检查器无法检查类型防护的任意函数。诸如 之类的隐式拒绝self.assertIsNotNone(var)并不等同于针对 的显式检查None。需要额外的、明确的排除。
self.assertIsNotNone(var)\nassert var is not None # reject None case after this point\ndo_something(var)\nRun Code Online (Sandbox Code Playgroud)\n当然,总是可以cast放弃这个选择。由于这会禁用变量类型的验证,因此它通常应该只是最后的手段。
do_something(cast(ast.Module, var))\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
4224 次 |
| 最近记录: |