مشكلة وحل 9: حل مشكلة NameError name is not defined في بايثون

مشكلة وحل 9: حل خطأ NameError name is not defined في بايثون للمبتدئين

من أكثر الأخطاء التي تواجه المبتدئين أثناء تعلم بايثون خطأ:

NameError: name 'name' is not defined

وقد يظهر الخطأ بصيغ مختلفة، مثل:

NameError: name 'age' is not defined
NameError: name 'print_name' is not defined
NameError: name 'Python' is not defined

هذا الخطأ يعني ببساطة أن Python حاولت استخدام اسم متغير أو دالة أو قيمة، لكنها لم تجد تعريفًا لهذا الاسم في الكود. في هذا الدرس من سلسلة مشكلة وحل على بايثون العرب، سنشرح سبب ظهور هذا الخطأ، وكيف تصلحه خطوة بخطوة مع أمثلة عملية واضحة.

{getToc} $title={محتوى المقال}

{alertInfo} خطأ NameError غالبًا لا يعني أن الكود معقد، بل يعني أن هناك اسمًا مستخدمًا في الكود لم يتم تعريفه قبل استخدامه.

مثال يوضح ظهور خطأ NameError عند استخدام متغير غير معرف في بايثون

ما معنى خطأ NameError name is not defined؟

رسالة الخطأ:

NameError: name 'username' is not defined

تعني أن الاسم username غير معروف بالنسبة لبايثون. بمعنى آخر، أنت استخدمت اسمًا في الكود قبل أن تقوم بإنشائه أو تعريفه.

مثال بسيط:

print(username)

هذا الكود سيظهر خطأ؛ لأن المتغير username لم يتم تعريفه قبل استخدامه.

الحل هو تعريف المتغير أولًا:

username = "Ahmed"

print(username)

الناتج:

Ahmed

السبب الأول: استخدام متغير قبل تعريفه

أشهر سبب لظهور خطأ NameError هو استخدام متغير قبل أن تكتب له قيمة.

مثال خاطئ:

print(age)

age = 20

سيظهر الخطأ لأننا حاولنا طباعة age قبل أن نعرّفه.

الحل الصحيح:

age = 20

print(age)

الناتج:

20
{alertSuccess} في بايثون يجب تعريف المتغير قبل استخدامه. الترتيب في الكود مهم جدًا.

السبب الثاني: خطأ إملائي في اسم المتغير

أحيانًا يكون المتغير موجودًا فعلًا، لكنك تكتبه مرة بطريقة ومرة بطريقة أخرى. في هذه الحالة ستتعامل Python معهما كاسمين مختلفين.

مثال خاطئ:

student_name = "Sara"

print(student_nam)

لاحظ أن المتغير الأصلي اسمه student_name، لكن في الطباعة كتبناه student_nam بدون الحرف الأخير.

الحل:

student_name = "Sara"

print(student_name)

الناتج:

Sara

مقارنة توضح أن الخطأ الإملائي في اسم المتغير يسبب NameError في Python

{alertWarning} بايثون حساسة لحالة الأحرف. المتغير name مختلف عن Name ومختلف عن NAME.

السبب الثالث: نسيان علامات الاقتباس حول النص

من الأسباب الشائعة جدًا عند المبتدئين أنهم يكتبون النص بدون علامات اقتباس. عندها تعتقد Python أن النص اسم متغير، وليس قيمة نصية.

مثال خاطئ:

print(Python)

هذا الكود لا يطبع كلمة Python، بل يبحث عن متغير اسمه Python. ولأن هذا المتغير غير موجود، سيظهر خطأ:

NameError: name 'Python' is not defined

الحل الصحيح هو وضع النص بين علامات اقتباس:

print("Python")

الناتج:

Python

شرح خطأ NameError عند كتابة نص بدون علامات اقتباس في بايثون

السبب الرابع: استخدام دالة قبل تعريفها

قد يظهر خطأ NameError أيضًا عند استدعاء دالة غير موجودة أو لم يتم تعريفها بعد.

مثال خاطئ:

say_hello()

إذا لم تكن هناك دالة باسم say_hello، سيظهر الخطأ.

الحل هو تعريف الدالة أولًا:

def say_hello():
    print("Hello")

say_hello()

الناتج:

Hello
{alertInfo} عند استخدام الدوال، تأكد أن اسم الدالة مكتوب بشكل صحيح وأنها معرفة قبل استدعائها في مسار تنفيذ الكود.

السبب الخامس: استخدام متغير داخل نطاق غير مناسب

أحيانًا يكون المتغير معرفًا داخل دالة، وتحاول استخدامه خارج الدالة. هنا قد يظهر لك خطأ لأن المتغير داخل نطاق محلي وليس متاحًا خارج الدالة.

مثال خاطئ:

def show_name():
    name = "Omar"

print(name)

المتغير name موجود داخل الدالة فقط، لذلك لا تستطيع استخدامه خارجها بهذه الطريقة.

حل بسيط هو الطباعة داخل الدالة:

def show_name():
    name = "Omar"
    print(name)

show_name()

الناتج:

Omar

أو يمكنك استخدام return لإرجاع القيمة:

def get_name():
    name = "Omar"
    return name

result = get_name()
print(result)

السبب السادس: نسيان import عند استخدام مكتبة أو دالة خارجية

إذا استخدمت شيئًا من مكتبة خارجية أو مكتبة مدمجة بدون استيرادها، فقد يظهر خطأ NameError.

مثال خاطئ:

print(random.randint(1, 10))

هنا استخدمنا random بدون استيراد المكتبة.

الحل:

import random

print(random.randint(1, 10))

جدول سريع لأسباب NameError وحلولها

السبب مثال على المشكلة الحل
استخدام متغير قبل تعريفه print(age) عرّف المتغير قبل استخدامه
خطأ إملائي في الاسم student_nam اكتب نفس اسم المتغير بالضبط
نسيان علامات الاقتباس print(Python) اكتب النص هكذا: "Python"
استخدام دالة غير معرفة say_hello() عرّف الدالة قبل استدعائها
مشكلة في النطاق Scope متغير داخل دالة ثم استخدامه خارجها استخدمه داخل الدالة أو أعده باستخدام return
نسيان import random.randint() اكتب import random أولًا

ملخص أسباب وحلول خطأ NameError name is not defined في بايثون

كيف تصلح خطأ NameError خطوة بخطوة؟

عندما يظهر لك الخطأ، لا تبدأ بتغيير الكود عشوائيًا. اتبع هذه الخطوات:

  1. اقرأ اسم المتغير أو الدالة الموجود داخل رسالة الخطأ.
  2. ابحث في الكود: هل هذا الاسم معرف فعلًا؟
  3. تأكد أن الاسم مكتوب بنفس الحروف ونفس حالة الأحرف.
  4. إذا كان نصًا، تأكد أنه داخل علامات اقتباس.
  5. إذا كان دالة، تأكد أنها معرفة قبل استدعائها.
  6. إذا كان من مكتبة، تأكد أنك كتبت import بشكل صحيح.
{alertSuccess} أفضل طريقة لحل NameError هي قراءة الاسم الموجود داخل رسالة الخطأ، ثم البحث عنه في الكود والتأكد أنه معرف قبل استخدامه.

مثال عملي كامل

لنأخذ مثالًا فيه خطأ، ثم نصلحه:

first_name = "Ali"

print(frist_name)

سيظهر خطأ لأننا كتبنا frist_name بدل first_name.

الحل:

first_name = "Ali"

print(first_name)

الناتج:

Ali

أخطاء قريبة من NameError

قد ترى أخطاء أخرى قريبة في الفكرة، مثل:

  • UnboundLocalError: يظهر غالبًا عند التعامل مع متغير محلي داخل دالة بطريقة غير صحيحة.
  • AttributeError: يظهر عندما تستخدم دالة أو خاصية غير موجودة في نوع البيانات.
  • ImportError: يظهر عند وجود مشكلة في استيراد مكتبة أو عنصر من مكتبة.

كل هذه الأخطاء تصبح أسهل عندما تفهم معنى رسالة الخطأ وتحدد السطر الذي ظهرت فيه المشكلة.

أسئلة شائعة

ما سبب خطأ NameError name is not defined في بايثون؟

السبب أنك استخدمت اسم متغير أو دالة أو مكتبة قبل تعريفه أو استيراده، أو كتبته بطريقة مختلفة عن الاسم الأصلي.

هل NameError يعني أن Python لا تعرف المتغير؟

نعم. هذا الخطأ يعني أن Python لم تجد تعريفًا للاسم الذي استخدمته في الكود.

لماذا يظهر NameError عند كتابة نص عادي؟

لأن النص إذا كُتب بدون علامات اقتباس، ستتعامل معه Python كأنه اسم متغير. لذلك يجب كتابة النصوص بين علامات اقتباس مثل "Python".

هل اختلاف الحروف الكبيرة والصغيرة يسبب NameError؟

نعم. في بايثون، المتغير name مختلف عن Name ومختلف عن NAME.

روابط مهمة من بايثون العرب

مصدر خارجي مفيد

يمكنك الرجوع إلى توثيق Python الرسمي لمعرفة المزيد عن الاستثناءات والأخطاء، ومن بينها NameError: Python Documentation - NameError.

الخلاصة

خطأ NameError: name is not defined في بايثون يظهر عندما تستخدم اسمًا غير معروف بالنسبة للغة، مثل متغير غير معرف، أو دالة غير موجودة، أو نص مكتوب بدون علامات اقتباس، أو مكتبة لم يتم استيرادها.

تذكر دائمًا:

  • عرّف المتغير قبل استخدامه.
  • اكتب اسم المتغير بنفس الشكل في كل مرة.
  • ضع النصوص بين علامات اقتباس.
  • عرّف الدوال قبل استدعائها.
  • استخدم import عند التعامل مع المكتبات.
{alertSuccess} القاعدة الذهبية: عندما ترى NameError، ابحث عن الاسم الموجود في رسالة الخطأ، وتأكد أنه مكتوب ومعرّف بشكل صحيح قبل السطر الذي سبب المشكلة.

إرسال تعليق

أحدث أقدم