اذهب إلى المحتوى

السؤال

نشر (معدل)

بفرض لدي وحدة في بايوثن تحتوي دالة معينة واريد استدعاء تلك الدالة عن طريق اسمها فقط.. هل توجد طريقة لفعل ذلك؟ مثلا لو كان لدي دالة اسمها func داخل وحدة اسمها mod واريد ان استدعي هذه الدالة من خلال اسمها فقط.. كيف يمكن فعل ذلك؟

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال

Recommended Posts

  • 0
نشر

يمكنك استخدام الدالة getattr، حيث تعيد الدّالة getattr()‎ قيمة الخاصيّة المُعطاة من الكائن المُعطى، ويتم صياغتها بالشكل التالي:

getattr(object, name[, default])

حيث يمثل الوسيط الأول الكائن المراد الحصول على قيمة خاصيّته.
أما name فتمثل سلسلة نصيّة تُمثّل اسم الخاصيّة المرغوب الوصول إلى قيمتها.
default مُعامل اختياريّ. القيمة الافتراضيّة التي ستُعاد إن لم تكن الخاصيّة موجودة.
ولمزيد من التفاصيل عن هذه الدالة يمكنك الانتقال إلى هذا الرابط في موسوعة حسوب.

- الآن بالنسبة لمثالك، وعلى فرض أنه لدينا الوحدة mod، والدالة func، فإننا نكتب:

# استيراد الوحدة
import mod
# نمرر اسم الدالة كوسيط ثاني والوحدة كوسيط أول
methodToCall = getattr(mod, 'func')
result = methodToCall()

واختصاراً يمكن كتابة:

result = getattr(mod, 'func')()

 

  • 0
نشر

إن تضمين الوحدة باستخدام import module يقوم بتحميل كامل الملف و مجال التسمية الخاصة والتي تدعى name space 

يمكن استخدام الأسلوب التالي لتضمين دالة محددة من ضمن وحدة باستخدام:

from module import func as myfunction

myfunction()

مع العلم، تضمين دالة محددة من الوحدة سيقوم بنفس العمل لتضمين الوحدة كاملة (نفس حجم المصادر التي يتم تحميلهم) لا يمكن تحميل الدالة لوحدها خلف الكواليس.

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

>>> from math import cos as cosine
>>> cosine(0)
1.0

أو  وضع _ قبل الاسم

>>> from math import sin
>>> sin(0)
0.0

#########

>>> from math import sin as _sin
>>> _sin(0)
0.0

#########

from math import pi

print(pi)

ربما هذه الطريقة أكثر قابلية للقراءة، كما أن الدالة التي تم تضمينها وحدها يمكننا الوصول لها.

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...