وحدة الاستيراد في Python مع الأمثلة

⚡ ملخص ذكي

استيراد في Python يُتيح ذلك لملف واحد إعادة استخدام المتغيرات والدوال والفئات المُعرّفة في ملف آخر. الوحدة النمطية هي ببساطة ملف بامتداد .py، بينما تُجمّع الحزمة الوحدات النمطية ذات الصلة داخل دليل مُحدّد بملف __init__.py.

  • 🔘 ما هي الوحدة النمطية؟ الوحدة النمطية هي ملف .py واحد يحتوي على متغيرات أو دوال أو فئات.
  • ☑️ كلمة الاستيراد الرئيسية: تقوم الدالة import بتحميل وحدة كاملة؛ بينما تقوم الدالة module_name.function_name باستدعاء أعضائها.
  • ✅ الاستيراد الانتقائي: يستورد الأمر `from module import name` الدوال أو المتغيرات التي تحتاجها فقط.
  • 🧪 اسماء مستعارة: استيراد الوحدة كـ alias يختصر الأسماء الطويلة؛ من الوحدة استيراد * يكشف كل شيء.
  • 🛠️ الحزم والمسارات: يقوم الملف __init__.py بتحويل مجلد إلى حزمة؛ ويقوم الملف sys.path بسرد مواقع البحث.
  • 🤖 سير عمل الذكاء الاصطناعي: تستورد مشاريع التعلم الآلي مكتبات NumPy و pandas و PyTorch كوحدات نمطية.

وحدة الاستيراد في Python

تشرح الأقسام التالية الوحدات النمطية والحزم وأنماط الاستيراد المختلفة وكيفية عمل الاستيراد المطلق والنسبي في Python.

ما هي الوحدات في Python?

الوحدة النمطية هي ملف يحتوي على Python الكود. يمكن أن يكون الكود على شكل متغيرات أو دوال أو فئة مُعرَّفة. يصبح اسم الملف هو اسم الوحدة.

على سبيل المثال، إذا كان اسم الملف الخاص بك هو guru99.py، فسيكون اسم الوحدة هو guru99. باستخدام وظيفة الوحدة النمطية، يمكنك تقسيم التعليمات البرمجية الخاصة بك إلى ملفات مختلفة بدلاً من كتابة كل شيء داخل ملف واحد.

ما هو Python وحدة الاستيراد؟

يُعتبر الملف وحدة نمطية في Pythonلاستخدام الوحدة، يجب عليك استيرادها باستخدام استيراد الكلمة المفتاحية. يمكن استخدام الدوال أو المتغيرات الموجودة داخل الملف في ملف آخر عن طريق استيراد الوحدة. هذه الوظيفة متوفرة في لغات أخرى مثل TypeScript, Javaنص, Java، روبي ، إلخ.

كيفية إنشاء واستيراد وحدة في Python?

الآن سنقوم بإنشاء وحدة نمطية واستيرادها إلى ملف آخر.

فيما يلي خطوات إنشاء الوحدة واستيرادها كما هو موضح في لقطة الشاشة:

إنشاء واستيراد وحدة نمطية في Python

اتبع الخطوات الموضحة لإنشاء وحدة نمطية في Python.

بنية المجلد المستخدمة لاختبار الكود هي كما يلي:

modtest/
	test.py
	display.py	

الخطوة 1) أنشئ ملفًا وسمّه test.py

الخطوة 2) داخل test.py، قم بإنشاء وظيفة تسمى Display_message()

Def display_message():
    return "Welcome to Guru99 Tutorials!"

الخطوة 3) الآن قم بإنشاء ملف Display.py آخر.

الخطوة 4) قم باستيراد ملف الوحدة النمطية test.py داخل ملف display.py، كما هو موضح أدناه:

import test

أثناء الاستيراد، ليس عليك ذكر ملف test.py ولكن فقط اسم الملف.

الخطوة 5) بعد ذلك، يمكنك استدعاء الدالة display_message() من الملف test.py داخل الملف display.py. ستحتاج إلى استخدام module_name.function_name.

على سبيل المثال test.display_message().

Import test
print(test.display_message())

الخطوة 6) عند تشغيل ملف display.py، ستحصل على ما يلي الإخراج:

Welcome to Guru99 Tutorials!

استيراد فئة في Python

لقد رأينا سابقاً وحدة نمطية بسيطة تحتوي على دالة. هنا سنقوم بإنشاء فئة والإشارة إليها داخل ملف آخر.

بنية المجلدات لاختبار الكود هي كما يلي:

myproj/
	Car.py
	display.py

قم بإنشاء ملف يسمى Car.py بالكود التالي:

اسم الملف: Car.py

class Car:
	brand_name = "BMW"
	model = "Z4"
	manu_year = "2020"

	def __init__(self, brand_name, model, manu_year):
		self.brand_name = brand_name
		self.model = model
		self.manu_year = manu_year

	def car_details(self):
		print("Car brand is ", self.brand_name)
		print("Car model is ", self.model)
		print("Car manufacture year is ", self.manu_year)
			
			
	def get_Car_brand(self):
		print("Car brand is ", self.brand_name)

	def get_Car_model(self):
		print("Car model is ", self.model) 

يحتوي الملف Car.py على السمات brand_name و model و manu_year. أما الدوال المعرفة داخل الفئة فهي car_details() و get_Car_brand() و get_Car_model().

دعونا الآن نستخدم الملف Car.py كوحدة نمطية في ملف آخر يسمى Display.py.

اسم الملف: Display.py

import Car
car_det = Car.Car("BMW","Z5", 2020)
print(car_det.brand_name)
print(car_det.car_details())
print(car_det.get_Car_brand())
print(car_det.get_Car_model())

الإخراج:

BMW
Car brand is  BMW
Car model is  Z5
Car manufacture year is  2020
Car brand is  BMW
Car model is  Z5

لذا يمكننا الوصول إلى جميع المتغيرات والوظائف من Car.py باستخدام وحدة Car.

استخدام من لاستيراد الوحدة النمطية

يمكنك استيراد جزء صغير فقط من الوحدة، أي فقط الوظائف المطلوبة وأسماء المتغيرات من الوحدة بدلاً من استيراد الكود الكامل.

عندما تريد استيراد أشياء محددة فقط، يمكنك استخدام الكلمة المفتاحية "from" لاستيراد ما تريد.

لذلك فإن بناء الجملة هو

from  module import your function_name , variables,... etc.

بنية المجلد المستخدمة لاختبار الكود هي كما يلي:

modtest/
	test.py
	display.py	

يحتوي ملف test.py على دالتين كما هو موضح:

اسم الملف: test.py

defdisplay_message():
	return "Welcome to Guru99 Tutorials!"
	
def display_message1():
	return "All about Python!"

الآن أنت بحاجة إلى الدالة display_message(). يمكنك الوصول مباشرةً إلى الدالة أو المتغير الذي تستورده كما هو موضح أدناه:

اسم الملف: Display.py

from test import display_message
print(display_message())

الإخراج:

Welcome to Guru99 Tutorials!

أما إذا قمت باستخدام الدالة display_message1()، فستظهر لك رسالة خطأ تفيد بأن الدالة غير معرّفة كما هو موضح أدناه:

from test import display_message
print(display_message1())

الإخراج:

Traceback (most recent call last):
File "display.py", line 3, in <module>
print(display_message1())
Name Error: name 'display_message1' is not defined

استيراد كل شيء من الوحدة

تتيح لك خاصية الاستيراد استيراد الوحدة النمطية بالكامل باستخدام الاستيراد متبوعًا باسم الوحدة النمطية، أي اسم الملف أو المكتبة المراد استخدامها.

بناء الجملة:

Import module

أو باستخدام ملفات

from module import *

بنية المجلد المستخدمة لاختبار الكود هي كما يلي:

modtest/
	test.py
	display.py	

فيما يلي تفاصيل الكود داخل test.py

my_name = "Guru99"
my_address = "Mumbai"

defdisplay_message():
	return "Welcome to Guru99 Tutorials!"
	
	
def display_message1():
	return "All about Python!"

باستخدام وحدة الاستيراد

باستخدام اسم وحدة الاستيراد فقط، للإشارة إلى المتغيرات والوظائف داخل الوحدة، يجب عليك إضافة اسم الوحدة كبادئة لها.

مثال

اسم الملف: Display.py

Import test
print(test.display_message())
print(test.display_message1())
print(test.my_name)
print(test.my_address)

يُستخدم اسم الوحدة النمطية test للإشارة إلى الدوال والمتغيرات الموجودة داخل الوحدة النمطية test.

الإخراج:

Welcome to Guru99 Tutorials!
All about Python!
Guru99
Mumbai

استخدام الاستيراد *

دعونا نرى مثالا باستخدام يستورد *. عن طريق يستورد *، يمكن الوصول إلى الوظائف والمتغيرات مباشرة، كما هو موضح في المثال أدناه:

from test import *

print(display_message())
print(display_message1())
print(my_name)
print(my_address)

الإخراج:

Welcome to Guru99 Tutorials!
All about Python!
Guru99
Mumbai

الدالة دير ().

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

لذلك عند استخدام الدالة dir() على الوحدة النمطية، فإنها ستعطيك المتغيرات والوظائف الموجودة داخل الوحدة النمطية.

إليك مثال عملي لاستخدام الدالة dir() في وحدة برمجية. لدينا فئة تُسمى Car.py، فلنستوردها ونُسندها إلى الدالة dir() لنرى الناتج.

ستكون بنية المجلد لاختبار الكود كما يلي:

test prop/
	Car.py
	test.py	

اسم الملف: Car.py

class Car:
	brand_name = "BMW"
	model = "Z4"
	manu_year = "2020"

	def __init__(self, brand_name, model, manu_year):
		self.brand_name = brand_name
		self.model = model
		self.manu_year = manu_year

	def car_details(self):
		print("Car brand is ", self.brand_name)
		print("Car model is ", self.model)
		print("Car manufacture year is ", self.manu_year)
			
			
	def get_Car_brand(self):
		print("Car brand is ", self.brand_name)

	def get_Car_model(self):
		print("Car model is ", self.model) 

اسم الملف: test.py

import Car

class_contents = dir(Car)
print(class_contents)

يعطينا الإخراج اسم الفئة وجميع الوظائف المحددة في Car.py.

يمكنك أيضًا تجربة استخدام dir() على الوحدة النمطية المضمنة المتوفرة في Pythonلنجرب الأمر نفسه على جسون الوحدة كما هو موضح في المثال أدناه. ستعرض جميع الخصائص والأساليب المتاحة في جسون وحدة.

Import json
json_details = dir(json)
print(json_details)

الإخراج:

['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__bu
iltins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__pac
kage__', '__path__', '__spec__', '__version__', '_default_decoder', '_default_en
coder', 'codecs', 'decoder', 'detect_encoding', 'dump', 'dumps', 'encoder', 'loa
d', 'loads', 'scanner']

الباقات

الحزمة عبارة عن دليل يحتوي على جميع الوحدات المحددة بداخله. لجعل أ Python يتعامل المفسر مع المجلد كحزمة، لذا يجب أن يحتوي مجلدك على ملف __init__.py. هذا الملف يجعل المجلد حزمة. إليك بنية الحزمة التي سنعمل عليها.

الحزم في Python

اسم الحزمة هو حزمة بلديللبدء باستخدام الحزمة، أنشئ مجلدًا باسم mypackage/. داخل هذا المجلد، أنشئ ملفًا فارغًا باسم __init__.py. أنشئ ثلاثة ملفات أخرى هي module1.py وmodule2.py وmodule3.py، وحدد الدوال كما هو موضح في لقطة الشاشة. إليك تفاصيل الملفات module1.py وmodule2.py وmodule3.py

Module1.py

def mod1_func1():
print("Welcome to Module1 function1")

def mod1_func2():
print("Welcome to Module1 function2")

def mod1_func3():
print("Welcome to Module1 function3")

Module2.py

def mod2_func1():
print("Welcome to Module2 function1")

def mod2_func2():
print("Welcome to Module2 function2")

def mod2_func3():
print("Welcome to Module2 function3")

Module3.py

def mod3_func1():
print("Welcome to Module3 function1")

def mod3_func2():
print("Welcome to Module3 function2")

def mod3_func3():
print("Welcome to Module3 function3")

استخدم صفقة جاهز للاستخدام. الآن، استدعِ الحزمة داخل أي من ملفاتك كما هو موضح أدناه في ملف test.py:

هنا، يتم استيراد mypackage.module1 وإعطائه اسمًا مستعارًا وزارة الدفاع 1وبالمثل، يمكنك استخدام الوحدات الأخرى module2.py و module3.py من mypackage.

import mypackage.module1 as mod1

print(mod1.mod1_func1())
print(mod1.mod1_func2())
print(mod1.mod1_func2())

الإخراج:

Welcome to Module1 function1
None
Welcome to Module1 function2
None
Welcome to Module1 function2
None

لقد عرضنا للتو الحزمة باستخدام وحدة بسيطة تحتوي على وظائف. وبحسب مشروعك، يمكنك أيضاً إنشاء حزم تتضمن حزماً فرعية، أي مجلدات فرعية تحتوي على وحدات مع تعريفات للفئات.

Python مسار البحث عن الوحدة النمطية

أثناء التنفيذ، عندما Python يأتي عبر اسم وحدة الاستيراديحاول المفسر تحديد موقع الوحدة. يبحث عن الوحدة في قائمة الوحدات المدمجة، ثم في جميع الدلائل المحددة داخل sys.path.

باختصار، يقوم المترجم بالبحث التالي لتحديد موقع الوحدة:

  1. في الدليل الحالي الخاص بك.
  2. في قائمة الوحدات النمطية المدمجة.
  3. داخل مجلدات sys.path.

يمكنك الحصول على تفاصيل sys.path عن طريق استيراد وحدة sys وطباعة sys.path. سيعرض لك ذلك قائمة بالمجلدات كما هو موضح أدناه:

importsys
print(sys.path)

الإخراج:

['Python Latest\\task2', 'Users\\AppData\\Local\\Programs\\Python\
\Python37\\python37.zip', 'Users\\AppData\\Local\\Programs\\Python\\P
ython37\\DLLs']

يمكنك أيضًا تعديل المسار والاحتفاظ بالأدلة وفقًا لمتطلباتك.

استخدام الاسم المستعار للوحدة النمطية في الاستيراد

يمكنك أيضًا تحويل اسم الوحدة إلى صيغة أقصر عن طريق إعطائه اسمًا بديلًا. يمكن إنشاء الاسم البديل باستخدام as الكلمة.

بناء الجملة:

import filename as alias name

ستكون بنية المجلد لاختبار الكود كما يلي:

Mod test/
	test.py
	display.py	

فيما يلي الكود الموجود داخل test.py

my_name = "Guru99"
my_address = "Mumbai"

def display_message():
	return "Welcome to Guru99 Tutorials!"	
	
def display_message1():
	return "All about Python!"

الآن سنستخدم اسمًا بديلًا لملف test.py في ملف display.py

Import test as t

print(t.display_message())
print(t.display_message1())
print(t.my_name)
print(t.my_address)

الاسم المستعار المستخدم لوحدة الاختبار هو t. لذلك يمكن الإشارة إلى الدوال والمتغيرات من ملف test.py باستخدام الاسم المستعار t.

الإخراج:

Welcome to Guru99 Tutorials!
All about Python!
Guru99
Mumbai

الواردات المطلقة والنسبية في Python

أنت تعرف الآن كيفية استيراد ملف كوحدة نمطية داخل ملف آخر. دعونا الآن نرى كيفية إدارة الملفات المتوفرة في المجلدات. يمكن استيراد الملفات الموجودة في المجلدات إما باستخدام عمليات الاستيراد المطلقة أو النسبية.

ضع في اعتبارك أن لديك بنية مجلد المشروع الخاص بك، كما هو موضح أدناه:

الواردات المطلقة والنسبية في Python

المجلد الرئيسي هو myproject/. ويحتوي على مجلدين فرعيين هما package1 و package2.

يحتوي المجلد package1 على وحدتين، module1.py و module2.py.

يحتوي المجلد package2 على فئة واحدة myclass.py، وحزمة فرعية فرعية تحتوي على Module3.py، وأخيرة Module4.py.

  • يوجد في الملف module1.py دالة تسمى myfunc1.
  • يوجد في الملف module2.py دالة تسمى myfunc2.
  • يوجد في الملف module3.py دالة تسمى myfunc3.
  • يوجد في الملف module4.py دالة تسمى myfunc4.

استخدام الواردات المطلقة

بالنسبة لعمليات الاستيراد المطلقة، تحتاج إلى إضافة المسار الكامل لوحدتك مباشرة من مجلد جذر المشروع.

دعونا الآن نرى كيفية استخدام عمليات الاستيراد المطلقة للإشارة إلى الوظائف الموجودة في كل وحدة من الوحدات.

لاستخدام الدالة myfunc1، ستحتاج إلى استيرادها على النحو التالي:

from package1.module1  import  myfunc1
or
from package1 import module1
module1.myfunc1()  

لاستخدام الدالة myfunc3، ستحتاج إلى استيرادها على النحو التالي:

from package1.subpkg.module3  import  myfunc3
or
from package1.subpkg import module3
module3.myfunc3()  

مزايا وعيوب استخدام الواردات المطلقة

فيما يلي مزايا استخدام الواردات المطلقة:

  • يصبح من السهل tracأعد الوحدات النمطية لفحص الكود.
  • سهل الاستخدام ومباشر للغاية.
  • إذا تم نقل المشروع إلى مسار مختلف، فستظل عمليات الاستيراد كما هي.

عيوب استخدام الواردات المطلقة

فيما يلي عيوب استخدام الاستيراد المطلق:

  • قد يصبح مسار الاستيراد طويلاً جداً في حالة تداخل الوحدات النمطية وطول أسماء الوحدات النمطية.

استخدام الواردات النسبية

بالنظر إلى بنية المجلدات نفسها المذكورة أعلاه، سنرى كيفية استيرادها باستخدام عمليات الاستيراد النسبية.

في الاستيراد النسبي، تكون الوحدة المراد استيرادها نسبية للموقع الحالي، أي الموقع الذي توجد فيه عبارة الاستيراد.

بناء الجملة

في عمليات الاستيراد النسبية، تحتاج إلى إضافة نقطة (.) قبل اسم الوحدة عند الاستيراد باستخدام من.

ستكون هناك نقطتان (..) قبل اسم الوحدة إذا كانت الوحدة على مستوى أعلى من الموقع الحالي.

بالرجوع إلى شكل بنية المجلد المذكور أعلاه، لدينا الوحدات التالية مع وظائفها، والتي نحتاج إلى الرجوع إليها.

  • يوجد في الملف module1.py دالة تسمى myfunc1.
  • يوجد في الملف module2.py دالة تسمى myfunc2.
  • يوجد في الملف module3.py دالة تسمى myfunc3.
  • يوجد في الملف module4.py دالة تسمى myfunc4.

لاستخدام الدالة myfunc1، ستحتاج إلى استيرادها على النحو التالي:

from  .module1  import  myfunc1

لاستخدام الدالة myfunc3، ستحتاج إلى استيرادها على النحو التالي:

from  .subpkg.module3  import  myfunc3

مزايا الواردات النسبية

  • من السهل العمل مع الواردات النسبية.
  • من الموقع الحالي، يمكن اختصار الواردات مقارنة بالواردات المطلقة.

مساوئ الواردات النسبية

  • باستخدام الاستيراد النسبي، يصبح من الصعب trace back where the code is exist.

الأسئلة الشائعة

Python تعذر العثور على الوحدة. تأكد من كتابة اسم الملف بشكل صحيح، ومن وجوده في مسار النظام (sys.path) أو في المجلد الحالي، ومن تثبيت الحزمة في بيئتك الافتراضية النشطة. لتثبيت وحدات خارجية، شغّل الأمر pip install متبوعًا باسم الحزمة.

قم بتثبيته أولاً باستخدام بذرةأطلقت حملة Python استخدم مدير الحزم، على سبيل المثال pip install pandas. بعد تثبيته في بيئتك، استورده كالمعتاد باستخدام import pandas. أما الوحدات المدمجة مثل json فلا تحتاج إلى تثبيت.

يحدث الاستيراد الدائري عندما يستورد وحدتان برمجيتان بعضهما البعض، مما يؤدي إلى تحميل إحداهما جزئيًا فقط. يمكن إصلاح ذلك بدمج الشيفرة المشتركة، أو الاستيراد داخل الدالة التي تحتاجها، أو استيراد الوحدة البرمجية بأكملها بدلًا من استيراد أسماء محددة.

يقوم هذا الحارس بتشغيل التعليمات البرمجية فقط عند تنفيذ الملف مباشرةً، وليس عند استيراده. وبدونه، ستُعيد كل عملية استيراد تشغيل التعليمات البرمجية الرئيسية للوحدة. كما أنه يفصل الدوال القابلة لإعادة الاستخدام عن تعليمات الاختبار المكتوبة بأسلوب البرامج النصية.

رقم Python يُنفّذ هذا الأمر وحدةً برمجيةً مرةً واحدةً، ثم يُخزّنها مؤقتًا في sys.modules، ويُعيد استخدام هذا الكائن لعمليات الاستيراد اللاحقة. لفرض إعادة التحميل أثناء التطوير، استدعِ importlib.reload(module).

استخدم importlib.import_module(“name”) عندما يكون اسم الوحدة معروفًا فقط أثناء التشغيل، كما هو الحال عند تحميل الإضافات. تُعيد هذه الدالة كائن الوحدة، مما يتيح لك الوصول إلى وظائفها كما في عملية الاستيراد العادية.

يستورد كود التعلم الآلي مكتبات NumPy و pandas و scikit-learn و TensorFlow و PyTorch كوحدات نمطية. كما تقوم الفرق بتقسيم مسارات العمل الخاصة بها إلى وحدات نمطية وحزم قابلة لإعادة الاستخدام، ثم تستورد وظائف المعالجة المسبقة والتدريب المشتركة عبر البرامج النصية.

نعم. يقترح GitHub Copilot والمساعدون الآليون سطور الاستيراد أثناء الكتابة، ويضيفون الاستيرادات المفقودة، ويساعدون في حل أخطاء الاستيراد. تأكد دائمًا من تثبيت الوحدة وتطابق اسمها مع بيئتك قبل الوثوق بأي اقتراح.

تلخيص هذه التدوينة بـ: