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

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

NameError: name 'username' is not defined

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

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

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

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

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

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

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

مثال بسيط:

print(username)

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

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

username = "Ahmed"

print(username)

الناتج:

Ahmed

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

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

مثال خاطئ:

print(age)

age = 20

هنا حاولنا طباعة age قبل تعريفه، لذلك لا تعرفه Python في هذا السطر.

الصحيح:

age = 20

print(age)

الناتج:

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

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

أحيانًا يكون المتغير معرفًا بالفعل، لكنك تكتبه مرة باسم ومرة باسم آخر. في هذه الحالة ستتعامل بايثون معهما كمتغيرين مختلفين.

مثال خاطئ:

student_name = "Sara"

print(student_nam)

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

الصحيح:

student_name = "Sara"

print(student_name)

الناتج:

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

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

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

مثال خاطئ:

print(Python)

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

الصحيح:

print("Python")

الناتج:

Python
{alertError} أي نص تريد طباعته كما هو يجب أن يكون بين علامات اقتباس، مثل "Python" أو 'Python'.

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

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

مثال خاطئ:

say_hello()

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

الصحيح:

def say_hello():
    print("Hello")

say_hello()

الناتج:

Hello

لاحظ أننا عرفنا الدالة باستخدام def قبل استدعائها.

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

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

مثال خاطئ:

def show_name():
    name = "Omar"

print(name)

المتغير name تم إنشاؤه داخل الدالة، لذلك لا يمكن استخدامه مباشرة خارجها.

حل صحيح: اطبع المتغير داخل الدالة:

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

show_name()

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

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

result = get_name()
print(result)

لشرح أعمق عن هذه الفكرة يمكنك قراءة: أساسيات بايثون 15: المتغيرات المحلية والعامة Scope في Python.

السبب السادس: نسيان import عند استخدام مكتبة

إذا استخدمت مكتبة مثل random أو math بدون استيرادها أولًا، فقد يظهر خطأ NameError.

مثال خاطئ:

print(random.randint(1, 10))

هنا استخدمنا random بدون كتابة import random.

الصحيح:

import random

print(random.randint(1, 10))
{alertInfo} إذا ظهر NameError مع اسم مكتبة، تأكد أنك استوردت المكتبة باستخدام import قبل استخدامها.

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

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

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

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

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

مثال عملي كامل على تصحيح الخطأ

لنأخذ مثالًا فيه خطأ إملائي بسيط:

first_name = "Ali"

print(frist_name)

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

الحل:

first_name = "Ali"

print(first_name)

الناتج:

Ali

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

هناك أخطاء أخرى قد تبدو قريبة من NameError، لكنها تعني شيئًا مختلفًا:

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

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

أخطاء شائعة يجب الانتباه لها

الخلط بين النص والمتغير

إذا أردت طباعة نص، استخدم علامات الاقتباس:

print("Hello")

أما إذا أردت طباعة قيمة متغير، فاكتب اسم المتغير بدون اقتباس:

message = "Hello"

print(message)

استخدام اسم مختلف بحرف كبير

هذا الكود خاطئ:

name = "Sara"

print(Name)

لأن name مختلف عن Name في بايثون.

نسيان تعريف الدالة

إذا استخدمت دالة باسم معين، تأكد أن تعريفها موجود:

def welcome():
    print("Welcome")

welcome()

أسئلة شائعة

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

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

هل NameError يعني أن المتغير غير موجود؟

نعم، في الغالب يعني أن بايثون لم تجد تعريفًا للاسم الذي استخدمته في الكود.

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

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

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

نعم. في بايثون name و Name و NAME أسماء مختلفة.

كيف أعرف السطر الذي سبب الخطأ؟

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

روابط مفيدة

الخلاصة

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

تذكر دائمًا:

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

تمرين بسيط لك

حاول تصحيح الكود التالي:

course_name = "Python"

print(course)

سبب الخطأ أن المتغير الموجود هو course_name، لكننا حاولنا طباعة course.

الحل:

course_name = "Python"

print(course_name)

إرسال تعليق

أحدث أقدم