Python 3.x 在Python3.7+;中键入一个返回字符串或错误的方法;

Python 3.x 在Python3.7+;中键入一个返回字符串或错误的方法;,python-3.x,type-hinting,mypy,pytype,Python 3.x,Type Hinting,Mypy,Pytype,我有一个Python脚本,它以在当前目录中搜索CSV文件的方法开始,或者下载一个目录进行一些处理。如果未找到CSV文件,则程序不应运行并退出,并显示错误消息 I类型注释了一个暂定方法,如下所示: import glob import os def get_csv_filename() -> str: """ Returns first csv filename in current folder or Downloads folder "

我有一个Python脚本,它以在当前目录中搜索CSV文件的方法开始,或者下载一个目录进行一些处理。如果未找到CSV文件,则程序不应运行并退出,并显示错误消息

I类型注释了一个暂定方法,如下所示:

import glob
import os


def get_csv_filename() -> str:
    """ Returns first csv filename in current folder or Downloads folder """
    csv_filenames = glob.glob('*.csv')
    if csv_filenames:
        return csv_filenames[0]
    home = os.path.expanduser("~")
    csv_filenames = glob.glob(home + "/Downloads/*.csv")
    if csv_filenames:
        return csv_filenames[0]
    # If I don't use return, I also get problems with pylint
    return exit("Error: no file found, check the documentation for more info.")


def main() -> None:
    """ Reads a CSV and does some processing """
    filename = get_csv_filename()
如果我使用例如pytype键入check,我会得到错误:

get_csv_filename: bad option in return type [bad-return-type]
  Expected: str
  Actually returned: None
您建议如何使此代码符合要求?PEP 484的

可能会有所帮助。我没有安装mypy或pytype来尝试它,但这可能会起作用:

from typing import NoReturn

def get_csv_filename() -> str:
    """ Returns first csv filename in current folder or Downloads folder """
    csv_filenames = glob.glob('*.csv')
    if csv_filenames:
        return csv_filenames[0]
    ...
    stop("Error: no file found, check the documentation for more info.")
    return ""

def stop(msg) -> NoReturn:
    exit(msg)
另一种选择是:

from typing import Union

def get_csv_filename() -> Union[None, str]:
...
根据的想法,可以用更简单的方法解决问题:

from typing import Optional
def get_csv_filename() -> Optional[str]:
    ...
事实上,
Optional[something]
相当于
Union[None,something]