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

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

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

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

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

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

كيفية إنشاء واستيراد وحدة في 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) داخل Display.py، قم باستيراد ملف Moduletest.py، كما هو موضح أدناه:

import test

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

الخطوة 5) ثم يمكنك استدعاء الدالة Display_message() من test.py داخل Display.py، وتحتاج إلى الاستفادة من الوحدة النمطية_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 باستخدام وحدة السيارة.

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

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

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

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

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)

يتم استخدام اختبار اسم الوحدة للإشارة إلى الوظيفة والمتغيرات داخل اختبار الوحدة.

الإخراج:

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() هي وظيفة مضمنة في لغة بايثون. تقوم الدالة dir() بإرجاع كافة الخصائص والأساليب، بما في ذلك الخصائص المضمنة للكائن المحدد.

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

فيما يلي مثال عملي لـ dir() على الوحدة النمطية. لدينا فئة تسمى Car.py، فلنستورد Car ونخصصها إلى 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. يقوم init.py بإنشاء الدليل كحزمة. هنا هو تخطيط الحزمة التي سنعمل عليها.

الحزم في Python

اسم الحزمة هو حزمة بلدي. للبدء في العمل بالحزمة، قم بإنشاء دليل يسمى package/. داخل الدليل، قم بإنشاء ملف فارغ يسمى __init__.py. قم بإنشاء 3 ملفات أخرى 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 وإعطائه اسمًا مستعارًا mod1. وبالمثل، يمكنك استخدام الوحدات النمطية الأخرى Module2.py وmodule3.py من ملف package.

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 مسار البحث عن الوحدة النمطية

أثناء التنفيذ، عندما يأتي بايثون اسم وحدة الاستيراد، يحاول المترجم تحديد موقع الوحدة النمطية. يقوم بالبحث في الوحدة النمطية في قائمة الوحدات النمطية المضمنة. Later في المجمل، الدلائل المحددة داخل 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']

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

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

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

بناء الجملة:

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

المجلد الجذر هو مشروعي/. يحتوي على مجلدين فرعيين package1 وpackage2.

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

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

  • في الوحدة النمطية 1.py، هناك وظيفة تسمىmyfunc1.
  • في الوحدة النمطية 2.py، هناك وظيفة تسمىmyfunc2.
  • في الوحدة النمطية 3.py، هناك وظيفة تسمىmyfunc3.
  • في الوحدة النمطية 4.py، هناك وظيفة تسمىmyfunc4.

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

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

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

للعمل مع functionmyfunc1، سوف تحتاج إلى الاستيراد كما يلي:

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()  

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

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

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

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

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

العيوب:

  • يمكن أن يصبح مسار الاستيراد طويلًا جدًا في حالة تداخل الوحدات النمطية، وإذا كان اسم الوحدات طويلًا.

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

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

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

بناء الجملة

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

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

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

  • في الوحدة النمطية 1.py، هناك وظيفة تسمىmyfunc1.
  • في الوحدة النمطية 2.py، هناك وظيفة تسمىmyfunc2.
  • في الوحدة النمطية 3.py، هناك وظيفة تسمىmyfunc3.
  • في الوحدة النمطية 4.py، هناك وظيفة تسمىmyfunc4.

للعمل مع functionmyfunc1 ستحتاج إلى الاستيراد كما يلي:

from  .module1  import  myfunc1

للعمل مع الدالة myfunc3، ستحتاج إلى الاستيراد كما يلي:

from  .subpkg.module3  import  myfunc3

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

المزايا:

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

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

العيوب:

  • باستخدام الواردات النسبية، من الصعب تتبع مكان وجود الكود

الملخص

  • استيراد في Python يساعدك على الرجوع إلى الكود، أي الوظائف/الكائنات المكتوبة في ملف آخر. كما يستخدم لاستيراد مكتبات/حزم بايثون المثبتة باستخدام pip (مدير حزم بايثون)، والتي تحتاج إلى استخدامها في الكود الخاص بك.
  • تتوفر وظيفة الاستيراد بلغات أخرى مثل الآلة الكاتبة، Javaسكريبت، جافا، روبي، الخ.
  • وحدة البايثون هي الكود المكتوب داخل الملف مثلا (test.py). داخل ملفك، يمكنك تحديد المتغيرات أو الوظائف أو الفئة الخاصة بك. يصبح الملف بأكمله وحدة ويمكن استيراده داخل ملف آخر للإشارة إلى الكود.
  • باستخدام وظيفة الوحدة النمطية، يمكنك تقسيم التعليمات البرمجية الخاصة بك إلى ملفات مختلفة بدلاً من كتابة كل شيء داخل ملف واحد. Laterباستخدام الاستيراد، يمكنك الرجوع إلى الكود الموجود داخل الملف الذي تحتاجه.
  • Python يحتوي على وحداته المدمجة، وكذلك المكتبات/الحزم الخارجية المثبتة باستخدام ملف مدير حزم بيثون (نقطة)، على سبيل المثال، الباندا، NumPy، وما إلى ذلك يشار إليها على أنها وحدات.
  • يمكنك استيراد جزء صغير فقط من الوحدة، أي فقط الوظائف المطلوبة وأسماء المتغيرات من الوحدة بدلاً من استيراد التعليمات البرمجية الكاملة.
  • يمكنك أيضًا تحويل اسم الوحدة النمطية إلى نموذج أقصر عن طريق إعطاء اسم مستعار لها. يمكن إجراء الاسم المستعار باستخدام الكلمة الأساسية.
  • الحزمة عبارة عن دليل يحتوي على جميع الوحدات المحددة بداخله. لجعل أ Python يعاملها المترجم كحزمة، يجب أن يحتوي دليلك على ملف __init.py. يقوم init.py بإنشاء الدليل كحزمة. هنا هو تخطيط الحزمة التي سنعمل عليها.
  • أثناء التنفيذ، عندما يأتي بايثون اسم وحدة الاستيراد، يحاول المترجم تحديد موقع الوحدة النمطية. يقوم بالبحث في الوحدة النمطية في قائمة الوحدات النمطية المضمنة. Later في المجمل، الدلائل المحددة داخل sys.path.
  • بالنسبة لعمليات الاستيراد المطلقة، تحتاج إلى إضافة المسار الكامل للوحدة النمطية الخاصة بك مباشرة من المجلد الجذر للمشروع.
  • في الاستيراد النسبي، تكون الوحدة النمطية المراد استيرادها مرتبطة بالموقع الحالي وهو الموقع الذي يوجد به بيان الاستيراد.