לכפות 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 object has no attribute shape. השגיאה מתרחשת כאשר NumPy שומר לערך None או שלא אותחל בכלל. כך מצביעה על כך שהמערך אינו מוגדר כראוי, ולכן אינך יכול להשתמש בו לביצוע פעולות.

במאמר זה, למדתם על פתרונות עבודה לפתרון השגיאה כך שתוכלו להשלים את הפיתוח באמצעות ספריות עיבוד נתונים כגון Pandas ו-NumPy.

ראשית מסבירים את הפתרונות בכלליות ולאחר מכן בפרטים. בואו נצלול.

ארוך מדי? הנה פתרון מהיר

  • אתחל מערך עם ערכים תקפים, או ודא שפונקציות אינן מחזירות None.
  • הקלט את כיוון התמונה או הסרטון כדי לוודא שהוא מדויק מכיוון שכיוון לא נכון מעורר שגיאה. כמו כן, ספק כיוון שאינו מכיל תווים Unicode מאחר שOpenCV אינו תומך בכזה. כפול שינוי מיקום התמונה או הסרטון.
  • הוסף אמור לאחר שאתה טוען את התמונה / מסגרת. ברצועה לשימוש בניסיון / להלן כדי לטפל בשגיאה.
  • אם אתה משתמש בתמונות שנוצרו באמצעות יצירת מלאכה ושמרת אותם אך נתקלת בשגיאה כאשר ניסית לפתוח את התמונה, שמו לב שאתה צריך להוסיף dtype=np.uint8 כך שתוכל לשמור תמונות שנוצרו באמצעות יצירת מלאכה. כמו כן, וודא כי המצלמה במכשיר שלך אינה פתוחה לתכנית אחרת. אם כן, סגור את התכנית לגמרי כך שהמצלמה מוקצה להישג הידיים.
  • במקרים אחרים, attributeerror מגיע מגרסאות מאוחרות יותר של OpenCV, אז נסה לעדכן את הגרסה.

1. בדוק כיוון

כפי שצוין קודם לכן, הסיבה העיקרית לשגיאה היא כאשר אתה משתמש בכיוון לא נכון. כך שזהו רעיון טוב לבדוק אם הכיוון קיים במכשיר או לא באמצעות פונקציה os.path.exists() שיטה. הפונקציה os.getcws() מדפיסה את הספרייה הנוכחית ולכן חיונית אם היית רוצה לבנות כיוון.

Python

 

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

2. השתמש בניסיון / להלן

זה גם אפשרי לנהל את השגיאה באמצעות הצהרת try/except. הנה כיצד הפתרון עובד:

Python

 

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

ראשית, הקטע try ירוץ, ואם נתקל בAttributeError, אז הבלוק except מבוצע.

3. הפוך את המשתנה ל-'None' באמצעות ההצהרה 'אם אחרת'

כדי לתקן את השגיאה, עליך לזהות היכן מגיעה הערך 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, והאזור האחר מבוצע כשערך המשתנה הוא 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 נפוץ בתכנות, ישנן מספר דרכים שאפשר לבחור ולפתור אותו. הדבר החשוב הוא לוודא שלפני שאתה מנסה לגשת לתכונת הצורה של אובייקט, לבדוק אם הוא None. אם הוא None, אז תחזיר None אחרת, תחזור ל shape.

אתה יכול עכשיו לפתור את השגיאה ולהמשיך לפתור בעיות.

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