我有一个函数参数,它可以接受图像的多种类型:
def somefunc(img: Union[np.array, Image, Path, str]):
PIL
Image
在这种情况下抛出以下异常:
TypeError: Union[arg, ...]: each arg must be a type. Got <module 'PIL.Image' from ...
进一步检查图像对象后这才有意义:
print(type(Image.open('someimage.tiff')))
>>> <class 'PIL.TiffImagePlugin.TiffImageFile'>
我该怎么做关于为 PIL 图像指定通用类型?它来自文件,它的格式应该是无关的。
你遇到的问题是
PIL.Image
本身并不是一个类型,而是一个模块。当你打开一个图像文件时,你得到的是一个继承自
PIL.Image.Image
类的图像对象,例如
PIL.TiffImagePlugin.TiffImageFile
。
为了解决这个问题,你可以使用
typing.Union
和
PIL.Image.Image
来指定类型提示:
from typing import Union
from PIL import Image
from pathlib import Path
def somefunc(img: Union[np.ndarray, Image.Image, Path, str]):
# ... 函数逻辑 ...
这样,类型提示就会接受
PIL.Image.Image
的任何子类,包括
PIL.TiffImagePlugin.TiffImageFile
等。
以下是完整的例子:
import numpy as np
from typing import Union
from PIL import Image
from pathlib import Path
def somefunc(img: Union[np.ndarray, Image.Image, Path, str]):
if isinstance(img, Image.Image):
print("这是一个 PIL 图像")
elif isinstance(img, np.ndarray):
print("这是一个 NumPy 数组")
elif isinstance(img, Path):
print("这是一个 Path 对象")
elif isinstance(img, str):
print("这是一个字符串")
else:
raise TypeError("不支持的图像类型")
# 测试
somefunc(Image.open('someimage.tiff')) # 输出: 这是一个 PIL 图像
somefunc(np.array([[1,2],[3,4]])) # 输出: 这是一个 NumPy 数组
somefunc(Path('someimage.png')) # 输出: 这是一个 Path 对象
somefunc('someimage.jpg') # 输出: 这是一个字符串
这个例子展示了如何使用类型提示来接受多种类型的图像输入,并根据输入类型执行不同的操作。
标签:python,python-imaging-library,python-typing From: 58236138