من أكثر الأخطاء التي تواجه المبتدئين أثناء تعلم بايثون خطأ:
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 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
{alertWarning} بايثون حساسة لحالة الأحرف. المتغير name مختلف عن Name ومختلف عن NAME.
السبب الثالث: نسيان علامات الاقتباس حول النص
من الأسباب الشائعة جدًا عند المبتدئين أنهم يكتبون النص بدون علامات اقتباس. عندها تعتقد Python أن النص اسم متغير، وليس قيمة نصية.
مثال خاطئ:
print(Python)
هذا الكود لا يطبع كلمة Python، بل يبحث عن متغير اسمه Python. ولأن هذا المتغير غير موجود، سيظهر خطأ:
NameError: name 'Python' is not defined
الحل الصحيح هو وضع النص بين علامات اقتباس:
print("Python")
الناتج:
Python
السبب الرابع: استخدام دالة قبل تعريفها
قد يظهر خطأ 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 خطوة بخطوة؟
عندما يظهر لك الخطأ، لا تبدأ بتغيير الكود عشوائيًا. اتبع هذه الخطوات:
- اقرأ اسم المتغير أو الدالة الموجود داخل رسالة الخطأ.
- ابحث في الكود: هل هذا الاسم معرف فعلًا؟
- تأكد أن الاسم مكتوب بنفس الحروف ونفس حالة الأحرف.
- إذا كان نصًا، تأكد أنه داخل علامات اقتباس.
- إذا كان دالة، تأكد أنها معرفة قبل استدعائها.
- إذا كان من مكتبة، تأكد أنك كتبت
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.
روابط مهمة من بايثون العرب
- أساسيات بايثون 15: المتغيرات المحلية والعامة Scope في Python
- أساسيات بايثون 14: شرح return في الدوال
- حل خطأ ValueError invalid literal for int في Python
- مشكلة وحل 7: حل خطأ TypeError can only concatenate str not int to str
- تشغيل بايثون أون لاين بدون تثبيت
- أفضل طريقة لتعلم بايثون بالعربي من الصفر للمبتدئين
مصدر خارجي مفيد
يمكنك الرجوع إلى توثيق Python الرسمي لمعرفة المزيد عن الاستثناءات والأخطاء، ومن بينها NameError:
Python Documentation - NameError.
الخلاصة
خطأ NameError: name is not defined في بايثون يظهر عندما تستخدم اسمًا غير معروف بالنسبة للغة، مثل متغير غير معرف، أو دالة غير موجودة، أو نص مكتوب بدون علامات اقتباس، أو مكتبة لم يتم استيرادها.
تذكر دائمًا:
- عرّف المتغير قبل استخدامه.
- اكتب اسم المتغير بنفس الشكل في كل مرة.
- ضع النصوص بين علامات اقتباس.
- عرّف الدوال قبل استدعائها.
- استخدم
importعند التعامل مع المكتبات.
{alertSuccess} القاعدة الذهبية: عندما ترى NameError، ابحث عن الاسم الموجود في رسالة الخطأ، وتأكد أنه مكتوب ومعرّف بشكل صحيح قبل السطر الذي سبب المشكلة.