如何处理 Python 代码的 MyPy 类型检查中的可选情况

时间:2021-03-04 06:20:06

标签: python pandas types static-analysis mypy

我正在尝试使用 Python 3 类型提示,以使我的代码更简洁。每当我尝试通过 mypy 传递我的代码时,都会出现一些重复的错误,提到有关 Optional 数据类型的内容,我不知道为什么。

这是一个示例函数。

def directory_to_dataframe(directory_name: str) -> pandas.DataFrame:
    '''
    Get the contents of a directory as a single dataframe.

    :param directory_name: The directory to read
    '''
    # print(directory_name)
    directory: str = os.path.join(CONTAINER_ROOT, directory_name)

    def read_method(parquet: str) -> pandas.DataFrame:
        return pandas.read_parquet(path=os.path.join(directory,
                                                     parquet))

    if not os.path.isdir(s=directory):
        return pandas.DataFrame()
    files_to_read: Iterator[str] = filter(
        lambda filename: filename.endswith('.parquet'),
        os.listdir(path=directory))
    try:
        return pandas.concat(objs=map(read_method, files_to_read),
                             verify_integrity=True,
                             ignore_index=True).fillna(value=0)  # Mypy raises error
    except ValueError:
        return pandas.DataFrame()

Mypy 抱怨 Incompatible return value type (got "Optional[DataFrame]", expected "DataFrame")

我认为 pandas.concat() 将始终返回一个数据帧,所以我不明白为什么返回类型必须是 Optional(这意味着 None 返回的可能性)。

这是另一个类似的案例。

daily_count: pandas.DataFrame = pandas.DataFrame(data=daily_ids['ID'].value_counts()).reset_index()

Mypy 抱怨 expression has type "Optional[DataFrame]", variable has type "DataFrame"

所以我缺少一些关于何时将 Optional 应用于变量或函数返回类型以使 mypy 满意的信息。此外,如果我确实应用了 Optional,那么在涉及该变量的任何进一步操作中,MyPy 会抱怨该操作对 None 类型无效。

0 个答案:

没有答案
相关问题