يظهر خطأ TypeError: missing 1 required positional argument عندما تستدعي Function أو Method أو تنشئ Object بدون تمرير قيمة مطلوبة في تعريفها. أهم شيء في الرسالة هو اسم الـargument الموجود في آخرها. فإذا ظهر 'name' فالدالة لم تستقبل name، وإذا ظهر 'self' فغالبًا تم استدعاء Instance Method بطريقة خاطئة، وإذا ظهر الخطأ داخل __init__() فغالبًا أنشأت Object بدون القيم المطلوبة.
في مشكلة وحل 32 من بايثون العرب سنحل الحالات الثلاث الأكثر ظهورًا في نتائج البحث: Function ناقصة argument، وself، و__init__، ثم نشرح متى تستخدم default arguments أو keyword arguments بدل تغيير الكود عشوائيًا.
{getToc} $title={محتوى المقال}
{alertInfo}
الحل السريع: اقرأ اسم الـargument المفقود في آخر سطر من Traceback، ثم قارن بين Parameters في تعريف الدالة والقيم التي مررتها عند الاستدعاء. لا تستخدم try/except لإخفاء هذا الخطأ؛ أصلح الاستدعاء أو تعريف الدالة.
شكل خطأ missing 1 required positional argument
لنبدأ بأبسط مثال:
def greet(name):
print("Hello", name)
greet()
ستظهر رسالة قريبة من:
TypeError: greet() missing 1 required positional argument: 'name'
المعنى مباشر: الدالة greet() عُرّفت وهي تحتاج قيمة اسمها name، لكنك استدعيتها بدون تمرير أي قيمة.
الحل الأول: مرّر الـargument المطلوب عند الاستدعاء
الحل الطبيعي هو تمرير القيمة التي تحتاجها الدالة:
def greet(name):
print("Hello", name)
greet("Ali")
الناتج:
Hello Ali
هذه هي الحالة الأكثر بساطة: عدد القيم المرسلة أقل من عدد الـparameters المطلوبة.
ما الفرق بين Parameter وArgument؟
في هذا المثال:
def greet(name):
pass
greet("Ali")
nameداخل تعريف الدالة هو Parameter."Ali"عند استدعاء الدالة هو Argument.
ويظهر الخطأ عندما توجد Parameters مطلوبة لم تحصل على Arguments مناسبة عند الاستدعاء.
إذا كنت ما زلت تتعلم الدوال، راجع: أساسيات بايثون 13: شرح Functions في Python للمبتدئين.
ماذا يعني missing 2 required positional arguments؟
إذا كانت الدالة تحتاج قيمتين ولم تمرر أيًا منهما:
def calculate_total(price, tax):
return price + tax
calculate_total()
ستظهر رسالة مشابهة لـ:
TypeError: calculate_total() missing 2 required positional arguments: 'price' and 'tax'
إذن الرقم 1 أو 2 في الرسالة لا يغيّر نوع المشكلة؛ هو فقط يخبرك بعدد القيم الإلزامية التي لم تصل إلى الدالة.
التصحيح:
def calculate_total(price, tax):
return price + tax
total = calculate_total(100, 15)
print(total)
استخدام Keyword Arguments لتقليل أخطاء الترتيب
يمكنك تمرير القيم حسب اسم الـparameter:
def create_user(name, age):
print(name, age)
create_user(age=25, name="Ali")
هنا لم نعتمد على ترتيب القيم لأن أسماء الـparameters مكتوبة بوضوح.
{alertSuccess} إذا كانت الدالة تستقبل عدة قيم متشابهة، يمكن أن تجعل Keyword Arguments الاستدعاء أوضح وأسهل في القراءة.
الحل الثاني: استخدم Default Argument إذا كانت القيمة اختيارية فعلًا
إذا كان من المنطقي أن تعمل الدالة حتى عند عدم تمرير قيمة، يمكنك إعطاء parameter قيمة افتراضية:
def greet(name="Guest"):
print("Hello", name)
greet()
greet("Sara")
الناتج:
Hello Guest
Hello Sara
لكن لا تضف default value فقط لإسكات الخطأ. إذا كانت القيمة ضرورية لعمل الدالة، فالأفضل أن تبقى مطلوبة وأن تمررها بشكل صحيح.
حل missing 1 required positional argument: 'self'
هذه من أكثر صور الخطأ ظهورًا في نتائج البحث.
لنفترض أن لدينا:
class Dog:
def bark(self):
print("Woof!")
Dog.bark()
ستظهر:
TypeError: Dog.bark() missing 1 required positional argument: 'self'
السبب أن bark() هي Instance Method. عند استدعائها من Object، تمرر Python هذا الـobject تلقائيًا كأول argument إلى self. لكننا استدعيناها مباشرة من الـclass.
الحل:
class Dog:
def bark(self):
print("Woof!")
dog = Dog()
dog.bark()
لماذا لا نكتب self عند الاستدعاء؟
عندما تكتب:
dog.bark()
تتعامل Python معها من حيث الفكرة كأنها:
Dog.bark(dog)
ولهذا لا تكتب self بنفسك عند استدعاء Instance Method من الـobject.
لدينا شرح متخصص يوضح الفرق بين الأنواع الثلاثة للـmethods: الفرق بين classmethod وstaticmethod وInstance Method في Python.
ملاحظة مهمة: ليس كل استدعاء من Class يعطي missing self
هذه نقطة تُشرح بشكل غير دقيق أحيانًا. إذا كانت الـmethod تستقبل أكثر من parameter، فقد تمر القيم التي كتبتها إلى أماكن مختلفة.
مثلًا:
class Calculator:
def add(self, x, y):
return x + y
Calculator.add(5, 10)
في هذا الاستدعاء يمكن أن تعتبر Python القيمة 5 هي self والقيمة 10 هي x، ثم تشتكي من أن y مفقودة. لذلك اقرأ اسم argument المفقود الفعلي ولا تفترض أن المشكلة دائمًا self.
متى أستخدم staticmethod بدل Instance Method؟
إذا كانت الدالة داخل class لكنها لا تحتاج بيانات Object ولا تستخدم self أصلًا، قد تكون @staticmethod مناسبة:
class Calculator:
@staticmethod
def add(x, y):
return x + y
print(Calculator.add(5, 10))
لكن لا تضف @staticmethod فقط للهروب من خطأ self. إذا كانت العملية تحتاج بيانات object، فالحل الصحيح هو إنشاء object واستدعاء Instance Method منه.
حل __init__() missing required positional argument
النوع الثاني المهم من نتائج البحث يظهر عند إنشاء Object بدون تمرير القيم التي يطلبها __init__.
class User:
def __init__(self, username):
self.username = username
user = User()
النتيجة:
TypeError: User.__init__() missing 1 required positional argument: 'username'
الحل هو تمرير القيمة عند إنشاء الـobject:
class User:
def __init__(self, username):
self.username = username
user = User("Ali")
print(user.username)
هل يمكن جعل قيمة __init__ اختيارية؟
نعم إذا كان ذلك منطقيًا في تصميم class:
class User:
def __init__(self, username="Guest"):
self.username = username
user = User()
print(user.username)
مشكلة __init__ مع الوراثة وsuper()
قد تكون القيم المطلوبة موجودة في Parent Class.
class Person:
def __init__(self, name):
self.name = name
class Student(Person):
def __init__(self, name, grade):
super().__init__(name)
self.grade = grade
student = Student("Sara", 95)
print(student.name, student.grade)
إذا كتبت super().__init__() بدون name بينما Parent Class تطلبها، سيظهر خطأ missing required positional argument من constructor الأب.
كيف تعرف أين المشكلة بسرعة؟
ابدأ من آخر سطر في Traceback وابحث عن ثلاثة أشياء:
- اسم Function أو Method: مثل
greet()أوDog.bark()أوUser.__init__(). - عدد Arguments المفقودة: واحد أم اثنان أم أكثر.
- اسم كل Argument: مثل
'name'أو'self'أو'username'.
| الرسالة | السبب الأقرب | أول شيء تفحصه |
|---|---|---|
missing 1 required positional argument: 'name' |
Function استدعيت بدون قيمة مطلوبة. | قارن تعريف الدالة مع الاستدعاء. |
missing 1 required positional argument: 'self' |
Instance Method استدعيت غالبًا من class بدل object. | أنشئ instance ثم استدعِ method منه. |
__init__() missing ... |
Object أُنشئ بدون قيم constructor المطلوبة. | افحص Parameters في __init__. |
missing 2 required positional arguments |
هناك قيمتان إلزاميتان لم يتم تمريرهما. | اقرأ الاسمين الظاهرين في الرسالة. |
إذا كانت رسالة Traceback طويلة ولا تعرف كيف تبدأ منها، راجع: كيف تشخّص أخطاء Python عمليًا بعد قراءة Traceback؟.
أخطاء شائعة عند محاولة الحل
1. إضافة self إلى كل دالة
self تخص Instance Methods داخل class، وليست حلًا عامًا لأي Function ناقصة argument.
2. تحويل كل Parameter إلى Default
إذا كانت القيمة مطلوبة منطقيًا، لا تجعلها اختيارية فقط لإزالة الخطأ.
3. استخدام try/except لإخفاء TypeError
هذا الخطأ غالبًا خطأ برمجي في تعريف الدالة أو طريقة استدعائها. الأفضل إصلاح السبب لا التقاط الخطأ والاستمرار وكأن شيئًا لم يحدث.
4. التركيز على عدد القيم ونسيان اسم الـargument
الرسالة لا تقول فقط إن قيمة مفقودة؛ بل تذكر اسمها غالبًا. هذا الاسم أسرع طريق للمشكلة.
5. الخلط مع أخطاء Positional Arguments الأخرى
رسائل مثل takes 1 positional argument but 2 were given أو positional argument follows keyword argument أخطاء مختلفة. هذا المقال مخصص لحالة القيم المطلوبة المفقودة.
Checklist قبل أن تعدّل الكود
- اقرأ آخر سطر كاملًا من Traceback.
- حدد اسم Function أو Method التي ظهر معها الخطأ.
- افتح تعريفها وراجع Parameters المطلوبة.
- راجع الاستدعاء وعدد Arguments المرسلة.
- إذا كان الاسم المفقود
self، تحقق أنك تستدعي Instance Method من object. - إذا كان الخطأ في
__init__، راجع القيم المرسلة عند إنشاء object. - استخدم default value فقط عندما تكون القيمة اختيارية فعلًا.
- استخدم Keyword Arguments عندما تجعل الاستدعاء أوضح.
أسئلة شائعة
كيف أحل missing 1 required positional argument في Python؟
قارن Parameters المطلوبة في تعريف الدالة مع Arguments التي تمررها عند الاستدعاء. مرّر القيمة المفقودة، أو اجعل لها default value إذا كانت اختيارية فعلًا.
ما معنى positional argument في Python؟
هو Argument تحدد Python معناه غالبًا من موقعه وترتيبه في الاستدعاء، مثل greet("Ali") عندما تكون أول parameter هي name.
ما معنى missing 1 required positional argument: self؟
غالبًا استدعيت Instance Method من class مباشرة، لذلك لم تحصل method على object الذي يمثل self. أنشئ instance ثم استدعِ method منه.
لماذا يظهر __init__() missing required positional argument؟
لأن __init__ تطلب قيمة أو أكثر عند إنشاء object، لكنك لم تمررها. راجع تعريف __init__ والاستدعاء مثل User(...).
كيف أحل missing 2 required positional arguments؟
اقرأ اسمي القيمتين في الرسالة، ثم مررهما عند الاستدعاء أو اجعل إحداهما اختيارية بقيمة افتراضية إذا كان ذلك مناسبًا للتصميم.
هل @staticmethod تحل خطأ self دائمًا؟
لا. استخدمها فقط إذا كانت method لا تحتاج object ولا بياناته. إذا كنت تحتاج self.name أو أي instance attribute، فالحل الصحيح هو Instance Method واستدعاؤها من object.
روابط داخلية مفيدة من بايثون العرب
- سلسلة مشكلة وحل في بايثون
- شرح Functions في Python للمبتدئين
- الفرق بين classmethod وstaticmethod وInstance Method
- تشخيص أخطاء Python بعد قراءة Traceback
مصادر رسمية للتوسع
- Python Documentation — More on Defining Functions
- Python Documentation — Classes
- Python FAQ — What is self?
الخلاصة
خطأ TypeError: missing 1 required positional argument يعني أن Python حاولت تنفيذ Function أو Method لكن واحدة من القيم الإلزامية لم تصل إليها. الحل يبدأ دائمًا من اسم الـargument المذكور في الرسالة.
إذا كان الاسم متغيرًا عاديًا مثل name أو price، راجع استدعاء الدالة. إذا كان self، راجع طريقة استدعاء Instance Method. وإذا ظهر __init__()، راجع القيم التي تمررها عند إنشاء object. واستخدم Default Arguments فقط عندما تكون القيمة اختيارية فعلًا.
{alertSuccess} القاعدة الذهبية: لا تحاول إسكات TypeError. قارن تعريف الدالة بالاستدعاء، وحدد القيمة التي لم تصل، ثم أصلح المصدر مباشرة.




