我有一个对象src
和一个可选对象dest
。如果未将dest
传递给函数,则会创建一个新的MyObj
并将其传递给另一个函数。
使用mypy==0.610
这给了我:
错误:参数2到" copy_data"具有不兼容的类型"可选[MyObj]&#34 ;;预期" MyObj"
如何告诉MyPy dest
函数中copy_data
不是可选的?
from typing import Optional
class MyObj(object):
def __init__(self, name):
self.name = name
def new_obj(name):
# type (str) -> MyObj
return MyObj(name=name)
def copy_stuff(src, dest=None, fname=None):
# type: (MyObj, Optional[MyObj], Optional[str]) -> MyObj
if not dest:
dest = new_obj(fname)
my_obj = copy_data(src, dest)
return my_obj
def copy_data(src, dest):
# type: (MyObj, MyObj) -> MyObj
return dest
答案 0 :(得分:2)
此处的错误位于new_obj
。您在类型注释中缺少冒号。我通过在你的MVE中添加一些reveal_type
来解决这个问题:
def new_obj(name):
# type (str) -> MyObj
# ^ ERROR is here
return MyObj(name=name)
def copy_stuff(src, dest=None, fname=None):
# type: (MyObj, Optional[MyObj], Optional[str]) -> MyObj
reveal_type(new_obj) # E: Revealed type is 'def (name: Any) -> Any'
if not dest:
reveal_type(dest) # Optional[MyObj]
dest = new_obj(fname)
reveal_type(dest) # Optional[MyObj]
my_obj = copy_data(src, dest)
return my_obj
当从返回Optional[MyObj]
的函数指定时,Mypy似乎保持类型Any
。修复了类型注释后,它会按预期工作。