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

كيف أحصل على الشيفرة المصدرية لدالة في بايثون؟

TheProgrammer

السؤال

هل هنالك طريقة برمجية للحصول على الشيفرة البرمجية لدالة معينة في بايثون؟ أي أريد الحصول على الشيفرة البرمجية كما كُتبت من داخل البرنامج ومن دون النظر إلى ملفاته.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

للحصول على الشيفرة البرمجية لدالة مكتوبة بلغة بايثون يمكنك استخدام دالة getsourcelines من وحدة inspect حيث أنها ستُرجع لك الشيفرة البرمجية على شكل سلسلة نصية واحدة بعد أن تمرر لها اسم الدالة المطلوبة.
ملاحظة: حسب علمي إذا كانت الدالة قد تم تجميعها (compiled) من سلسلة نصية أو تم استدعاؤها من ملف تم تجميعه فإنك لن تستطيع الحصول على شيفرتها البرمجية.
عندما تكون الشيفرة البرمجية غير موجودة يمكنك استخدام دالة dis من مكتبة dis للحصول على بعض معلومات هذه الدالة كالتالي:

>>> import dis
>>> def foo(arg1,arg2):
...     #do something with args
...     a = arg1 + arg2
...     return a
...
>>> dis.dis(foo)
  3           0 LOAD_FAST                0 (arg1)
              3 LOAD_FAST                1 (arg2)
              6 BINARY_ADD
              7 STORE_FAST               2 (a)

  4          10 LOAD_FAST                2 (a)
             13 RETURN_VALUE
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

هناك عدة حالات، وكل حالة لها طريقة محددة.

1. كائنات غير مضمنة Objects that are not built-in.
في هذه الحالة نستخدم الدالة getsource من الوحدة inspect. مثلاً، هنا سنعرض الكود المصدر للدالة randint من الوحدة random:

import random
import inspect
print(inspect.getsource(random.randint)) 

الخرج:

 Output:
    def randint(self, a, b):
        """Return random integer in range [a, b], including both end points.
        """

        return self.randrange(a, b+1)

إذا أردت معرفة موقع الملف الخاص بها:

print(inspect.getfile(random.randint))
# c:\Python35\lib\random.py


2. الدوال التي يتم تعريفها من المستخدم:
هنا نستخدم dill.source.getsource، حيث أن الطريقة السابقة لاتنفع هنا.

# تعريف دالة ما
def add(a, b):
   return a + b
print(add.__code__.co_filename) # Output: <stdin> 
import dill
print (dill.source.getsource(add))

الخرج:

def add(a, b):
      return a + b


3 الدوال المُضمنة في بايثون Built-in objects.
لايمكن معرفتها إلا من خلال الذهاب إلى الكود المصدر لبايثون والاطلاع عليها من هناك source.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...