AttributeError: ‘NoneType’ 对象没有属性 ‘shape’
AttributeError: ‘NoneType’ object has no attribute ‘shape’
Python“AttributeError: ‘NoneType’ object has no attribute ‘shape’” 发生在我们访问shape
一个None
值的属性时,例如在将不正确的路径传递给cv2.imread()
.
要解决该错误,请确保指定正确的路径。
这是一个非常简单的示例,说明错误是如何发生的。
import cv2 # 👇️ None img = cv2.imread('bad-path.png') # ⛔️ AttributeError: 'NoneType' object has no attribute 'shape' print(img.shape)
当传递的路径不正确时,该imread
方法返回 None 。
尝试访问值shape
上的属性None
会导致错误。
在访问之前检查变量是否不是 Noneshape
在访问属性之前,您可以使用if
语句
检查变量是否为 None,shape
但您仍然必须更正路径。
import cv2 img = cv2.imread('thumbnail.webp') if img is not None: print('variable is not None') print(img.shape) else: print('variable is None')
该if
块仅在img
变量未存储None
值时运行,否则,该else
块运行。
您还可以将绝对路径传递给该cv2.imread()
方法。
import cv2 img = cv2.imread(r'/home/borislav/Desktop/bobbyhadz_python/thumbnail.webp') if img is not None: print('variable is not None') print(img.shape) else: print('variable is None')
我在 Linux 上,所以我的绝对路径以/home/user
.
如果您使用的是 Windows,您的绝对路径将类似于以下内容。
import cv2 img = cv2.imread(r'C:\Users\bobby_hadz\Desktop\thumbnail.webp') if img is not None: print('variable is not None') print(img.shape) else: print('variable is None')
确保在路径前加上 anr
以将其视为
原始字符串。
使用try/except
语句来处理错误
您还可以使用
try/except 语句来处理错误。
import cv2 img = cv2.imread('thumbnail.webp') try: print(img.shape) except AttributeError: print('AttributeError: value is', img)
如果访问shape
图像上的属性导致AttributeError
,则
except
块运行。
调用前检查路径是否存在cv2.imread()
您可以将路径传递给该os.path.exists()
方法以检查该路径是否存在。
import os # 👇️ check if path exists print(os.path.exists('thumbnail.webp')) # 👇️ returns the current working directory print(os.getcwd()) # 👉️ /home/borislav/Desktop/bobbyhadz_python
该os.getcwd()
方法返回当前工作目录,可在构建路径时使用。
None
共同的价值来源
最常见的None
价值来源是:
- 有一个不返回任何东西的函数(
None
隐式返回)。 - 将变量显式设置为
None
. - 将变量分配给调用不返回任何内容的内置函数的结果。
- 具有仅在满足特定条件时才返回值的函数。
请注意,所有未显式返回值的函数都隐式返回
None
。
一个不返回任何东西的函数返回 None
这是错误如何发生的另一个示例。
import cv2 def get_path(): print('thumbnail.webp') # 👇️ None img = cv2.imread(get_path()) # ⛔️ AttributeError: 'NoneType' object has no attribute 'shape' print(img.shape)
该get_path
函数不返回任何内容,因此它
返回 None。
我们最终传递None
给了方法,所以当我们访问一个值的属性cv2.imread
时发生了错误。shape
None
要解决错误,请确保从函数返回一个值。
import cv2 def get_path(): return 'thumbnail.webp' # 👇️ None img = cv2.imread(get_path()) print(img.shape) # 👉️ (120, 632, 3)
我们使用return 语句从函数返回一个字符串get_path
,所以一切都按预期进行。
None
如果函数仅在满足特定条件时才返回值,则您也可以从函数中获取值。
您必须确保在所有情况下都从函数返回一个值。
None
否则,如果不满足给定条件,函数将返回。
错误地将变量重新分配给 None
确保您没有None
错误地重新分配存储字符串的变量。
import cv2 path = 'thumbnail.webp' # 👇️ reassign to None by mistake path = None img = cv2.imread(path) # ⛔️ AttributeError: 'NoneType' object has no attribute 'shape' print(img.shape)
我们最初将path
变量设置为字符串,但后来将其重新分配给
None
导致错误的值。
在这种情况下,您必须追踪变量设置的位置None
并更正分配。
sort()
append()
None
如果错误仍然存在,请按照我的
AttributeError: ‘NoneType’ object has no attribute ‘X’
一文中的说明进行操作。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: