如何告诉MyPy参数不是可选的?

时间:2018-06-11 18:48:54

标签: python mypy

我有一个对象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

1 个答案:

答案 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。修复了类型注释后,它会按预期工作。