حل مشكلة AttributeError: ‘NoneType’ لا يحتوي الكائن على صفدة مسماة ‘Shape’

NumPy هو أداة مشهورة لحساب الأرقام التي تتضمن المصفوفات والمصفوفات والوظائف الرياضية. سمة الشكل لمصفوفة NumPy تُرجع ثلاثية تظهر بُعد المصفوفة. وعندما يتعلق الأمر بتحويل الشكل والتلاعب بمصفوفات NumPy، تكون السمة مهمة.

إليك كيفية عمل سمة shape:

Python

 

import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)

الناتج:

Python

 

(2, 2)

سمة الشكل مهمة أيضًا في pandas أو OpenCV.

فيما يلي كيفية استخدام سمة الشكل في OpenCV:

Python

 

import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)

الناتج:

Python

 

(1280, 1920, 3)

كما لوحظ، ينفذ البرنامج ويُرجع شكل (1280, 1920, 3). التفاصيل المقدمة مهمة لأنها تسمح بتقديم بنية المصفوفة وبالتالي يصبح ممكنًا القيام بعمليات عليها.

ومع ذلك، في بعض الأحيان قد تحاول الوصول إلى سمة الشكل ولكنك تنتهي برسالة الخطأ AttributeError: NoneType لا يحتوي الكائن على سمة shape. يحدث الخطأ عندما تكون NumPy قد تم تعيينها إلى قيمة لا شيء أو لم يتم تهيئتها على الإطلاق. لذلك يشير إلى أن المصفوفة ليست محددة بشكل صحيح، وبالتالي لا يمكنك استخدامها لإجراء العمليات.

في هذا المقال، تعرف على حلول عملية لحل الخطأ بحيث يمكنك إكمال التطوير باستخدام مكتبات معالجة البيانات مثل Pandas و NumPy.

نغطي أولاً الحلول بشكل خلاصي ثم فيما بعد بتفصيل. لنغطس في الموضوع.

طويل جدا؟ إليك حل سريع

  • قم بتهيئة مصفوفة بقيم صالحة، أو تأكد من عدم إرجاع الدوال None.
  • تأكد من دقة مسار الصورة أو الفيديو لأن المسار الخاطئ يثير الخطأ. أيضًا ، قدم مسارًا لا يحتوي على أحرف يونيكود لأن OpenCV لا يدعم مثل هذه. بديلًا آخر ، قم بتغيير موقع الصورة أو الفيديو.
  • أضف التأكد بعد تحميل الصورة / الإطار. خيار آخر هو استخدام try / except لمعالجة الخطأ.
  • إذا كنت تستخدم صورًا تم إنشاؤها بواسطة الذكاء الاصطناعي وحفظتها وواجهت الخطأ عند محاولة تنشيط الصورة ، فاضغط على أنك بحاجة إلى إضافة dtype=np.uint8 حتى تتمكن من حفظ صور الذكاء الاصطناعي. علاوة على ذلك ، تأكد من أن الكاميرا على جهازك ليست مفتوحة لبرنامج آخر. إذا كان الأمر كذلك ، قم بإغلاق البرنامج بالكامل حتى يتم تكييف الكاميرا للمشروع الحالي.
  • في حالات أخرى ، يأتي attributeerror من إصدارات OpenCV القديمة ، لذا حاول تحديث هذا الإصدار.

1. تحقق من المسار

كما ذكرنا سابقًا ، السبب الرئيسي للخطأ هو عند استخدام مسار غير صحيح. لذلك ، من الجيد التحقق مما إذا كان المسار موجودًا على الجهاز أم لا بمساعدة وظيفة os.path.exists() method. تطبع الوظيفة os.getcws() الدليل الحالي وبالتالي ضروري إذا كنت ترغب في بناء مسار.

Python

 

import os
print(os.path.exists('1.jpg'))
print(os.getcwd())

2. استخدم Try / Except

من الممكن أيضًا إدارة الخطأ باستخدام بيان try / except. إليك كيفية عمل الحل:

Python

 

import cv2
img = cv2.imread('1.jpg')
try:
     print(img.shape)
except AttributeError:
     print('The ultimate value: ', img)

أولاً ، ستعمل القسم المحاول ، وإذا واجه AttributeError ، فإن قسم except ينفذ.

3. تحقق مما إذا كانت المتغير ‘None’ باستخدام عبارة ‘If Else’

لإصلاح الخطأ، تحتاج إلى تحديد مكان ظهور قيمة None. لنفترض حالة شائعة حيث يحدث الخطأ؛ عندما تعمل مع مصفوفة NumPy. عندما تعمل مع مصفوفة NumPy، يمكنك الحصول على الخطأ عند العمل مع مصفوفة غير مهيأة أو مصفوفة قد تم تعيينها قيمة None.

على سبيل المثال:

Python

 

import numpy as np
arr = None
print(arr.shape)

الناتج للأعلى هو:

Python

 

AttributeError: 'NoneType' object has no attribute 'shape'

يمكنك التحقق من بيان معين وتحديد نوع المتغير الذي يعيده قبل الوصول إلى سمة الشكل. استخدام عبارة if-else مفيد في مثل هذه الحالات، حيث تتيح لك معرفة shape وتعيد None عندما لا يعيد shape قيمة.

فيما يلي مثال:

Python

 

import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(5)\2.jpg')
if img is not None:
     print(img.shape)
else:
     print('variable is Nonetype object')

الناتج:

Python

 

variable is Nonetype object

في المثال أعلاه، قمنا أولاً بتحديد المسار المطلق. يتنفذ الكتلة if فقط عندما يخزن المتغير قيمة صالحة ليست None، وتتنفذ الكتلة else عندما تكون قيمة المتغير None. نحصل على رسالة الخطأ variable is Nonetype object لأن المسار غير موجود. تعمل الخطوات بغض النظر عن نوع نظام التشغيل الذي تستخدمه، حيث تحتاج فقط إلى إدخال المسار.

4. تهيئة المصفوفة بقيم صالحة

خيار آخر عند الوقوع في خطأ أثناء استخدام NumPy هو التأكد من استخدام قيم صالحة. يمكن تحقيق ذلك عندما نقرأ البيانات من ملف أو مصدر آخر أو استخدام وظائف NumPy مثل zeros و ones.

هنا نقوم بتعديل الكود لتهيئة المصفوفة بأصفار:

Python

 

import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)

الإخراج:

Python

 

(3, 3)

الاستنتاج

في حين أن AttributeError: NoneType الكائن ليس له سمة shape شائعة في البرمجة، هناك عدة طرق يمكنك الاختيار بينها وحلها. الشيء المهم هو التأكد من أنك قبل محاولة الوصول إلى سمة shape لكائن، تحقق إذا كان None. إذا كان None، فإنك تعود None وإلا إذا كانت تعود إلى shape.

يمكنك الآن حل الخطأ والاستمرار في حل المشكلات.

Source:
https://dzone.com/articles/fix-attributeerror-nonetype-object-has-no-attribut