键入提示 returns 字符串或 Python 3.7+ 中的错误的方法
Type hinting a method that returns a string or error in Python 3.7+
我有一个 Python 脚本,它以在当前目录中搜索 CSV 文件或下载目录进行一些处理的方法开始。如果未找到 CSV 文件,程序不应 运行 并退出并显示错误消息。
我打字的初步方法如下:
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 我得到错误:
get_csv_filename: bad option in return type [bad-return-type]
Expected: str
Actually returned: None
您建议如何使此代码合规?
PEP 484 的 This section 可能会有帮助。我没有安装 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]
.
我有一个 Python 脚本,它以在当前目录中搜索 CSV 文件或下载目录进行一些处理的方法开始。如果未找到 CSV 文件,程序不应 运行 并退出并显示错误消息。
我打字的初步方法如下:
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 我得到错误:
get_csv_filename: bad option in return type [bad-return-type]
Expected: str
Actually returned: None
您建议如何使此代码合规?
This section 可能会有帮助。我没有安装 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]
.