الفرق بين المراجعتين لصفحة: «Python/modules»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
(5 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:الوحدات | <noinclude>{{DISPLAYTITLE:الوحدات في بايثون}}</noinclude> | ||
يؤدي الخروج من [[Python/interpreter|مفسّر بايثون]] إلى فقدان جميع التعريفات (الدوال والمتغيّرات) التي جرى إنشاؤها سابقًا. ولهذا السبب يفضل استخدام محررات النصوص البرمجية في حال الرغبة بكتابة برامج وشيفرات طويلة، ثم إرسال هذه الشيفرة إلى [[Python/interpreter|المفسّر]] وتشغيلها فيه. | يؤدي الخروج من [[Python/interpreter|مفسّر بايثون]] إلى فقدان جميع التعريفات (الدوال والمتغيّرات) التي جرى إنشاؤها سابقًا. ولهذا السبب يفضل استخدام محررات النصوص البرمجية في حال الرغبة بكتابة برامج وشيفرات طويلة، ثم إرسال هذه الشيفرة إلى [[Python/interpreter|المفسّر]] وتشغيلها فيه. | ||
وعندما يبدأ حجم البرنامج بالازدياد تدريجيًا تظهر الحاجة إلى تقسيم الشيفرة إلى ملفات متعددة لتسهيل العمل عليها. وقد يحتاج المبرمج في مرحلة ما إلى استخدام [[Python/ | وعندما يبدأ حجم البرنامج بالازدياد تدريجيًا تظهر الحاجة إلى تقسيم الشيفرة إلى ملفات متعددة لتسهيل العمل عليها. وقد يحتاج المبرمج في مرحلة ما إلى استخدام [[Python/defining_functions|دالة]] خاصة به في برامج متعدّدة دون أن يضطر إلى نسخ تعريف تلك الدالة في كلّ برنامج. | ||
تقدّم بايثون طريقة لإضافة التعريفات في ملف مستقل واستخدامها في شيفرة مستقلّة أو في [[Python/interpreter|مفسّر بايثون]] التفاعلي. تسمى هذه الملفات بالوحدات Modules. يمكن استيراد (import) التعريفات من وحدة إلى أخرى أو إلى الوحدة الرئيسة (main) والتي تضم مجموعة المتغيّرات التي يمكن الوصول إليها في شيفرة يجري تنفيذها في المستوى العالي أو في نمط الآلة الحاسبة. | تقدّم بايثون طريقة لإضافة التعريفات في ملف مستقل واستخدامها في شيفرة مستقلّة أو في [[Python/interpreter|مفسّر بايثون]] التفاعلي. تسمى هذه الملفات بالوحدات Modules. يمكن استيراد (import) التعريفات من وحدة إلى أخرى أو إلى الوحدة الرئيسة (main) والتي تضم مجموعة المتغيّرات التي يمكن الوصول إليها في شيفرة يجري تنفيذها في المستوى العالي أو في نمط الآلة الحاسبة. | ||
==إنشاء الوحدات في بايثون== | |||
الوحدة هي ملف يحتوي على تعريفات وعبارات [[Python|بايثون]]، واسم الملف هو نفسه اسم الوحدة إضافة إلى اللاحقة <code>.py</code>. يكون اسم الوحدة متوفّرًا داخل الوحدة ([[Python/str|كسلسلة نصية]]) كقيمة للمتغيّر العام <code>__name__</code>. | |||
يحتوي الملف <code>fibo.py</code> في المثال التالي على شيفرة تعريف دالة تنشئ متسلسلة فابيوناتشي إلى الحد <code>n</code>:<syntaxhighlight lang="python3"> | |||
# Fibonacci numbers module | # Fibonacci numbers module | ||
def fib(n): # n كتابة متسلسلة فابيوناتشي إلى الحد | def fib(n): # n كتابة متسلسلة فابيوناتشي إلى الحد | ||
سطر 28: | سطر 26: | ||
</syntaxhighlight>يمكن استيراد وحدة <code>fibo</code> إلى [[Python/interpreter|مفسّر بايثون]] باستخدام العبارة التالية:<syntaxhighlight lang="python3"> | </syntaxhighlight>يمكن استيراد وحدة <code>fibo</code> إلى [[Python/interpreter|مفسّر بايثون]] باستخدام العبارة التالية:<syntaxhighlight lang="python3"> | ||
>>> import fibo | >>> import fibo | ||
</syntaxhighlight> | </syntaxhighlight>لا تدخل العبارة السابقة أسماء الدوال المعرّفة في الوحدة <code>fibo</code> إلى جدول الرموز (Symbol table) الحالي بصورة مباشرة، وما يدخل إلى الجدول هو اسم الوحدة فقط. يمكن الوصول إلى تلك الدوال باستخدام اسم الوحدة وكما يلي:<syntaxhighlight lang="python3"> | ||
لا تدخل العبارة السابقة أسماء الدوال المعرّفة في الوحدة <code>fibo</code> إلى جدول الرموز Symbol table الحالي بصورة مباشرة، وما يدخل إلى الجدول هو اسم الوحدة فقط. يمكن الوصول إلى تلك الدوال باستخدام اسم الوحدة وكما يلي:<syntaxhighlight lang="python3"> | |||
>>> fibo.fib(1000) | >>> fibo.fib(1000) | ||
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 | 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 | ||
سطر 37: | سطر 33: | ||
>>> fibo.__name__ | >>> fibo.__name__ | ||
'fibo' | 'fibo' | ||
</syntaxhighlight>يمكن إسناد الدالة إلى اسم محلّي في حال الرغبة باستخدامها | </syntaxhighlight>يمكن إسناد الدالة إلى اسم محلّي في حال الرغبة باستخدامها على نحوٍ مكثّف:<syntaxhighlight lang="python3"> | ||
>>> fib = fibo.fib | >>> fib = fibo.fib | ||
>>> fib(500) | >>> fib(500) | ||
1 1 2 3 5 8 13 21 34 55 89 144 233 377 | 1 1 2 3 5 8 13 21 34 55 89 144 233 377 | ||
</syntaxhighlight> | </syntaxhighlight>يمكن للوحدة أن تتضمن عبارات قابلة للتنفيذ إضافة إلى [[Python/defining_functions|تعريفات الدوال]]، وتكون هذه العبارات معدّة لتهيئة (initialize) الوحدة، وتنفّذ فقط عند استخدام اسم الوحدة في عبارة <code>import</code> للمرة الأولى. (تنفّذ هذه العبارات إذا جرى تنفيذ الملف كشيفرة برمجية). | ||
يمكن للوحدة أن تتضمن عبارات قابلة للتنفيذ إضافة إلى [[Python/ | |||
تمتلك كلّ وحدة جدول رموز خاصٍّ بها، وتستخدم جميع الدوال المعّرفة في الوحدة هذا الجدول كجدول رموز عام؛ لذا لن يحدث أي تضارب بين المتغيّرات العامة التي يعرّفها مُنشئ الوحدة وبين المتغيرات العامة التي يُنشئها المستخدم. | تمتلك كلّ وحدة جدول رموز خاصٍّ بها، وتستخدم جميع الدوال المعّرفة في الوحدة هذا الجدول كجدول رموز عام؛ لذا لن يحدث أي تضارب بين المتغيّرات العامة التي يعرّفها مُنشئ الوحدة وبين المتغيرات العامة التي يُنشئها المستخدم. | ||
سطر 76: | سطر 70: | ||
>>> fibonacci(500) | >>> fibonacci(500) | ||
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 | 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 | ||
</syntaxhighlight> | </syntaxhighlight>'''ملاحظة:''' لغرض رفع كفاءة الأداء تستورد كلّ وحدة إلى [[Python/interpreter|مفسّر بايثون]] مرة واحدة في كل جلسة؛ لذا إن طرأ أي تغيير أو تعديل على الوحدات يجب إعادة تشغيل المفسّر، أو يمكن اختبار وحدة واحدة على نحوٍ تفاعلي باستخدام الدالة <code>importlib.reload()</code> وتمرير اسم الوحدة المراد اختبارها كمعامل لهذه الدالة. | ||
'''ملاحظة:''' | |||
لغرض رفع كفاءة الأداء تستورد كلّ وحدة إلى مفسّر بايثون مرة واحدة في كل جلسة؛ لذا إن طرأ أي تغيير أو تعديل على الوحدات يجب إعادة تشغيل المفسّر، أو يمكن اختبار وحدة واحدة | |||
مثال:<syntaxhighlight lang="python3"> | مثال:<syntaxhighlight lang="python3"> | ||
سطر 86: | سطر 76: | ||
importlib.reload(modulename) | importlib.reload(modulename) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==تنفيذ الوحدات كنصوص برمجية== | |||
== تنفيذ الوحدات كنصوص برمجية == | |||
يمكن تنفيذ الوحدة كنصّ برمجي باستخدام الأمر التالي في سطر الأوامر:<syntaxhighlight lang="shell"> | يمكن تنفيذ الوحدة كنصّ برمجي باستخدام الأمر التالي في سطر الأوامر:<syntaxhighlight lang="shell"> | ||
python fibo.py <arguments> | python fibo.py <arguments> | ||
سطر 100: | سطر 89: | ||
</syntaxhighlight>تستخدم هذه الطريقة لتقديم واجهة استخدام ملائمة للوحدة، أو لأغراض الاختبار، إذ يؤدي تشغيل الوحدة كنص برمجي إلى تنفيذ إجراء اختبار لها. | </syntaxhighlight>تستخدم هذه الطريقة لتقديم واجهة استخدام ملائمة للوحدة، أو لأغراض الاختبار، إذ يؤدي تشغيل الوحدة كنص برمجي إلى تنفيذ إجراء اختبار لها. | ||
عند استيراد وحدة باسم <code>spam</code> على سبيل المثال، يبدأ [[Python/interpreter|مفسر بايثون]] بالبحث عن وحدة داخلية built- | عند استيراد وحدة باسم <code>spam</code> على سبيل المثال، يبدأ [[Python/interpreter|مفسر بايثون]] بالبحث عن وحدة داخلية (built-in، أي مُضمَّنة في اللغة) تحمل هذا الاسم، وإن أخفق في العثور على واحدة يبحث المفسّر عن أيّ ملف يحمل الاسم <code>spam.py</code> في قائمة من المجلدات مخزّنة في المتغيّر <code>sys.path</code>. | ||
تهيّئ اللغة قيمة المتغيّر <code>sys.path</code> من المواقع التالية: | تهيّئ اللغة قيمة المتغيّر <code>sys.path</code> من المواقع التالية: | ||
* المجلّد الحاوي على ملف الشيفرة (أو المجلد الحالي في حال عدم تعيين أي ملف). | *المجلّد الحاوي على ملف الشيفرة (أو المجلد الحالي في حال عدم تعيين أي ملف). | ||
* <code>PYTHONPATH</code> وهو قائمة من أسماء المجلدات تحمل نفس صيغة المتغير <code>PATH</code> الخاص بالصدفة). | *<code>PYTHONPATH</code> وهو قائمة من أسماء المجلدات تحمل نفس صيغة المتغير <code>PATH</code> الخاص بالصدفة). | ||
* القيم الافتراضية عند تثبيت بايثون. | *القيم الافتراضية عند تثبيت بايثون. | ||
'''ملاحظة:''' | '''ملاحظة:''' في الأنظمة التي تدعم الوصلات الرمزية (symbolic links)، تُحدِّد اللغة المجلّد الحاوي لملف الشيفرة البرمجية بعد أن تتبع الوصلة الرميزة. وبعبارة أخرى لن يضاف المجلّد الذي يحتوي على وصلةٍ رمزيةٍ إلى مسار الوحدة. | ||
يمكن لبرامج بايثون أن تعدّل قيمة <code>sys.path</code> بعد تهيئتها، ويوضح المجلد الحاوي على ملف الشيفرة البرمجية في بداية مسار البحث قبل مسار المكتبة القياسية. وهذا يعني أنّ اللغة ستحمّل الشيفرات الموجودة في ذلك المجلد بدلًا عن الوحدات التي تمتلك الاسم ذاته في مجلد المكتبة، وهذا أمر خاطئ إلا إذا كان مقصودًا. راجع قسم [[Python/standard_modules|الوحدات القياسية]] للمزيد من المعلومات. | |||
==ملفات بايثون المصرّفة== | |||
يمكن لبرامج بايثون أن تعدّل قيمة <code>sys.path</code> بعد تهيئتها، ويوضح المجلد الحاوي على ملف الشيفرة البرمجية في بداية مسار البحث قبل مسار المكتبة القياسية. وهذا يعني أنّ اللغة ستحمّل الشيفرات الموجودة في ذلك المجلد بدلًا عن الوحدات التي تمتلك الاسم ذاته في مجلد المكتبة، وهذا أمر خاطئ إلا إذا كان مقصودًا. راجع قسم [[Python/ | |||
== ملفات بايثون المصرّفة == | |||
لزيادة سرعة عملية تحميل الوحدات تخبّئ بايثون نسخة مصرّفة من كلّ وحدة في مجلد يحمل الاسم <code>__pycache__</code> وتحمل كل نسخة الاسم <code>module.version.pyc</code>، ويرمز <code>version</code> هنا إلى تنسيق الملف المصرَّف، وعادة ما يكون رقم إصدار بايثون. | لزيادة سرعة عملية تحميل الوحدات تخبّئ بايثون نسخة مصرّفة من كلّ وحدة في مجلد يحمل الاسم <code>__pycache__</code> وتحمل كل نسخة الاسم <code>module.version.pyc</code>، ويرمز <code>version</code> هنا إلى تنسيق الملف المصرَّف، وعادة ما يكون رقم إصدار بايثون. | ||
سطر 124: | سطر 110: | ||
لا تتحقّق بايثون من النسخ المخبّئة في حالتين اثنتين: | لا تتحقّق بايثون من النسخ المخبّئة في حالتين اثنتين: | ||
# تعيد بايثون دائمًا تصريف الوحدات المحمّلة مباشرة من سطر الأوامر ولا تحفظ نتائج إعادة التصريف. | #تعيد بايثون دائمًا تصريف الوحدات المحمّلة مباشرة من سطر الأوامر ولا تحفظ نتائج إعادة التصريف. | ||
# لا تتحقّق بايثون من النسخ المخبّئة في حال غياب أي وحدة مصدرية. ولتدعم بايثون توزيعة غير مصدرية (مصرّفة فقط) يجب أن تكون الوحدة المصرّفة في المجلد المصدري ويجب أن لا يكون هناك أي وحدة مصدرية. | #لا تتحقّق بايثون من النسخ المخبّئة في حال غياب أي وحدة مصدرية. ولتدعم بايثون توزيعة غير مصدرية (مصرّفة فقط) يجب أن تكون الوحدة المصرّفة في المجلد المصدري ويجب أن لا يكون هناك أي وحدة مصدرية. | ||
==ملاحظات== | |||
== ملاحظات == | *يمكن استخدام المفتاحين <code>-O</code> و <code>-OO</code> مع أمر <code>python</code> في سطر الأوامر لتقليص حجم الوحدات المصرّفة. يحذف المفتاح <code>-O</code> عبارات <code>assert</code>، ويحذف المفتاح <code>-OO</code> عبارات <code>assert</code> و سلاسل <code>__doc__</code> النصية. تعتمد بعض البرامج على هذه العبارات؛ لذا يجب توخّي الحذر عند استخدام هذين المفتاحين. تحمل النسخة المحسّنة الوسم <code>opt-</code> وتكون أصغر حجمًا في العادة من الوحدات المصرّفة الأصلية. قد تتغير عملية التحسين في الإصدارات المستقبلية. | ||
* يمكن استخدام المفتاحين <code>-O</code> و <code>-OO</code> مع أمر | |||
* | *لا فرق في سرعة القراءة من ملف <code>.pyc</code> مقارنة بملف <code>.py</code>، ولكن تمتاز ملفات <code>.pyc</code> بسرعة أعلى في التحميل. | ||
== مصادر == | *يمكن للوحدة <code>compileall</code> أن تنشئ ملفات <code>.pyc</code> لجميع الوحدات الموجودة في مجلّد معين. | ||
* صفحة [https://docs.python.org/3/tutorial/modules.html Modules] في توثيق بايثون الرسمي. | ==مصادر== | ||
*صفحة [https://docs.python.org/3/tutorial/modules.html Modules] في توثيق بايثون الرسمي. | |||
[[تصنيف:Python]] | [[تصنيف:Python]] | ||
[[تصنيف:Python Modules]] | [[تصنيف:Python Modules]] |
المراجعة الحالية بتاريخ 09:13، 7 أكتوبر 2022
يؤدي الخروج من مفسّر بايثون إلى فقدان جميع التعريفات (الدوال والمتغيّرات) التي جرى إنشاؤها سابقًا. ولهذا السبب يفضل استخدام محررات النصوص البرمجية في حال الرغبة بكتابة برامج وشيفرات طويلة، ثم إرسال هذه الشيفرة إلى المفسّر وتشغيلها فيه.
وعندما يبدأ حجم البرنامج بالازدياد تدريجيًا تظهر الحاجة إلى تقسيم الشيفرة إلى ملفات متعددة لتسهيل العمل عليها. وقد يحتاج المبرمج في مرحلة ما إلى استخدام دالة خاصة به في برامج متعدّدة دون أن يضطر إلى نسخ تعريف تلك الدالة في كلّ برنامج.
تقدّم بايثون طريقة لإضافة التعريفات في ملف مستقل واستخدامها في شيفرة مستقلّة أو في مفسّر بايثون التفاعلي. تسمى هذه الملفات بالوحدات Modules. يمكن استيراد (import) التعريفات من وحدة إلى أخرى أو إلى الوحدة الرئيسة (main) والتي تضم مجموعة المتغيّرات التي يمكن الوصول إليها في شيفرة يجري تنفيذها في المستوى العالي أو في نمط الآلة الحاسبة.
إنشاء الوحدات في بايثون
الوحدة هي ملف يحتوي على تعريفات وعبارات بايثون، واسم الملف هو نفسه اسم الوحدة إضافة إلى اللاحقة .py
. يكون اسم الوحدة متوفّرًا داخل الوحدة (كسلسلة نصية) كقيمة للمتغيّر العام __name__
.
يحتوي الملف fibo.py
في المثال التالي على شيفرة تعريف دالة تنشئ متسلسلة فابيوناتشي إلى الحد n
:
# Fibonacci numbers module
def fib(n): # n كتابة متسلسلة فابيوناتشي إلى الحد
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
def fib2(n): # n إعادة متسلسلة فابيوناتشي إلى الحد
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
يمكن استيراد وحدة fibo
إلى مفسّر بايثون باستخدام العبارة التالية:
>>> import fibo
لا تدخل العبارة السابقة أسماء الدوال المعرّفة في الوحدة fibo
إلى جدول الرموز (Symbol table) الحالي بصورة مباشرة، وما يدخل إلى الجدول هو اسم الوحدة فقط. يمكن الوصول إلى تلك الدوال باستخدام اسم الوحدة وكما يلي:
>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
يمكن إسناد الدالة إلى اسم محلّي في حال الرغبة باستخدامها على نحوٍ مكثّف:
>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
يمكن للوحدة أن تتضمن عبارات قابلة للتنفيذ إضافة إلى تعريفات الدوال، وتكون هذه العبارات معدّة لتهيئة (initialize) الوحدة، وتنفّذ فقط عند استخدام اسم الوحدة في عبارة import
للمرة الأولى. (تنفّذ هذه العبارات إذا جرى تنفيذ الملف كشيفرة برمجية).
تمتلك كلّ وحدة جدول رموز خاصٍّ بها، وتستخدم جميع الدوال المعّرفة في الوحدة هذا الجدول كجدول رموز عام؛ لذا لن يحدث أي تضارب بين المتغيّرات العامة التي يعرّفها مُنشئ الوحدة وبين المتغيرات العامة التي يُنشئها المستخدم.
يمكن الوصول إلى المتغيّرات العامة في الوحدة باستخدام نفس الصياغة المتّبعة للوصول إلى دوالّها وهي: modname.itemname
.
يمكن للوحدات أن تستورد وحدات أخرى، ومن الشائع (لكن ليس من اللازم) أن توضع جميع عبارات import
في بداية الوحدة (أو الشيفرة). توضع أسماء الوحدات المستوردة في جدول الرموز العام الخاصّ بالوحدة المستورِدة.
يمكن استيراد اسم معيّن من الوحدة بصورة مباشرة إلى جدول رموز الوحدة المتسورِدة وكما يلي:
>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
لا يضاف اسم الوحدة في المثال السابق إلى جدول الرموز المحلي؛ لذا fibo
في المثال السابق هو اسم غير معرّف.
يمكن أيضًا استيراد جميع الأسماء التي تعرّفها الوحدة وكما يلي:
>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
تستورد عبارة import
في المثال السابق جميع الأسماء باستثناء تلك التي تبدأ بشرطة سفلية (_)
. لا يستخدم مبرمجو بايثون في معظم الأحيان هذه الطريقة لأنّها تؤدي إلى إدراج مجموعة مجهولة من الأسماء في مفسّر بايثون، ما يؤدي إلى إخفاء بعض العناصر المعرّفة مسبقًا.
وبصورة عامة لا ينصح إطلاقًا باستيراد كل شيء من الوحدة أو الحزمة، لأنّ ذلك يؤدي إلى التقليل من مقروئية الشيفرة، ولكن لا بأس باستخدام هذه الطريقة لتوفير بعض الجهد عند العمل في مفسّر بايثون التفاعلي.
يمكن ربط اسم خاص باسم الوحدة المستوردَة عن طريق استخدام الكلمة المفتاحية as
:
>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
وهكذا تصبح الوحدة المستوردَة متاحة باسم fib
.
يمكن استخدام as
في عبارة from
أيضًا:
>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
ملاحظة: لغرض رفع كفاءة الأداء تستورد كلّ وحدة إلى مفسّر بايثون مرة واحدة في كل جلسة؛ لذا إن طرأ أي تغيير أو تعديل على الوحدات يجب إعادة تشغيل المفسّر، أو يمكن اختبار وحدة واحدة على نحوٍ تفاعلي باستخدام الدالة importlib.reload()
وتمرير اسم الوحدة المراد اختبارها كمعامل لهذه الدالة.
مثال:
import importlib
importlib.reload(modulename)
تنفيذ الوحدات كنصوص برمجية
يمكن تنفيذ الوحدة كنصّ برمجي باستخدام الأمر التالي في سطر الأوامر:
python fibo.py <arguments>
ينفّذ هذا الأمر الشيفرة التي تتضمنها الوحدة fibo.py
كما لو تم استيرادها إلى المفسّر، ولكن تعيّن اللغة القيمة __main__
إلى المتغيّر العام __name__
في هذه الحالة. هذا يعني أنّه يمكن للوحدة أن تستخدم كنص برمجي وكوحدة قابلة للاستيراد بإضافة الشيفرة التالية إلى نهاية الوحدة، وذلك لأنّ الشيفرة التي تفسر سطر الأوامر لن تعمل إلا إذا كانت الوحدّة منفّذة كملف رئيسي "main"
:
$ python fibo.py 50
1 1 2 3 5 8 13 21 34
لا يؤدي استيراد الوحدة إلى تنفيذ الشيفرة:
>>> import fibo
>>>
تستخدم هذه الطريقة لتقديم واجهة استخدام ملائمة للوحدة، أو لأغراض الاختبار، إذ يؤدي تشغيل الوحدة كنص برمجي إلى تنفيذ إجراء اختبار لها.
عند استيراد وحدة باسم spam
على سبيل المثال، يبدأ مفسر بايثون بالبحث عن وحدة داخلية (built-in، أي مُضمَّنة في اللغة) تحمل هذا الاسم، وإن أخفق في العثور على واحدة يبحث المفسّر عن أيّ ملف يحمل الاسم spam.py
في قائمة من المجلدات مخزّنة في المتغيّر sys.path
.
تهيّئ اللغة قيمة المتغيّر sys.path
من المواقع التالية:
- المجلّد الحاوي على ملف الشيفرة (أو المجلد الحالي في حال عدم تعيين أي ملف).
PYTHONPATH
وهو قائمة من أسماء المجلدات تحمل نفس صيغة المتغيرPATH
الخاص بالصدفة).
- القيم الافتراضية عند تثبيت بايثون.
ملاحظة: في الأنظمة التي تدعم الوصلات الرمزية (symbolic links)، تُحدِّد اللغة المجلّد الحاوي لملف الشيفرة البرمجية بعد أن تتبع الوصلة الرميزة. وبعبارة أخرى لن يضاف المجلّد الذي يحتوي على وصلةٍ رمزيةٍ إلى مسار الوحدة.
يمكن لبرامج بايثون أن تعدّل قيمة sys.path
بعد تهيئتها، ويوضح المجلد الحاوي على ملف الشيفرة البرمجية في بداية مسار البحث قبل مسار المكتبة القياسية. وهذا يعني أنّ اللغة ستحمّل الشيفرات الموجودة في ذلك المجلد بدلًا عن الوحدات التي تمتلك الاسم ذاته في مجلد المكتبة، وهذا أمر خاطئ إلا إذا كان مقصودًا. راجع قسم الوحدات القياسية للمزيد من المعلومات.
ملفات بايثون المصرّفة
لزيادة سرعة عملية تحميل الوحدات تخبّئ بايثون نسخة مصرّفة من كلّ وحدة في مجلد يحمل الاسم __pycache__
وتحمل كل نسخة الاسم module.version.pyc
، ويرمز version
هنا إلى تنسيق الملف المصرَّف، وعادة ما يكون رقم إصدار بايثون.
على سبيل المثال، تخبّئ بايثون الملف spam.py
في المجلد __pycache__/spam.cpython-33.pyc
عند استخدام الإصدار 3.3
من CPython. تسمح طريقة التسمية هذه بوجود وحدات مصرّفة من إصدارات ونسخ مختلفة.
تقارن بايثون بين تاريخ تعديل النسخة الأصلية والنسخة المصرّفة للتحقّق ممّا إذا كانت النسخة المصرّفة قديمة وتحتاج إلى إعادة تصريف، وتجري هذه العملية بصورة تلقائية.
إلى جانب أنّ الوحدات المصرّفة لا تعتمد على نوع المنصّة التي تعمل عليها؛ لهذا يمكن مشاركة المكتبة ذاتها بين أنظمة مختلفة وبمعماريات مختلفة.
لا تتحقّق بايثون من النسخ المخبّئة في حالتين اثنتين:
- تعيد بايثون دائمًا تصريف الوحدات المحمّلة مباشرة من سطر الأوامر ولا تحفظ نتائج إعادة التصريف.
- لا تتحقّق بايثون من النسخ المخبّئة في حال غياب أي وحدة مصدرية. ولتدعم بايثون توزيعة غير مصدرية (مصرّفة فقط) يجب أن تكون الوحدة المصرّفة في المجلد المصدري ويجب أن لا يكون هناك أي وحدة مصدرية.
ملاحظات
- يمكن استخدام المفتاحين
-O
و-OO
مع أمرpython
في سطر الأوامر لتقليص حجم الوحدات المصرّفة. يحذف المفتاح-O
عباراتassert
، ويحذف المفتاح-OO
عباراتassert
و سلاسل__doc__
النصية. تعتمد بعض البرامج على هذه العبارات؛ لذا يجب توخّي الحذر عند استخدام هذين المفتاحين. تحمل النسخة المحسّنة الوسمopt-
وتكون أصغر حجمًا في العادة من الوحدات المصرّفة الأصلية. قد تتغير عملية التحسين في الإصدارات المستقبلية.
- لا فرق في سرعة القراءة من ملف
.pyc
مقارنة بملف.py
، ولكن تمتاز ملفات.pyc
بسرعة أعلى في التحميل.
- يمكن للوحدة
compileall
أن تنشئ ملفات.pyc
لجميع الوحدات الموجودة في مجلّد معين.
مصادر
- صفحة Modules في توثيق بايثون الرسمي.