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

السؤال

Recommended Posts

  • 0
نشر

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

file = open('file_path', 'w')
try:
    file.write('hello world')
finally:
    file.close()

أما إذا إستخدمت with مع as ومعناها "ك" أي فتح ملف معين ك file (اسم متغير) كما في المثال التوضيحي

with open('file_path', 'w') as file:
    file.write('hello world !')

فكما ترى في المثال الأول قمنا بإستدعاء ()close بينما في المثال الثاني لم نقم بذلك لأن with ستقوم بإغلاق الموارد تلقائياً 

  • 0
نشر

جملة with تستعمل للتعامل مع المصادر غير المدارة unmanaged resources مثل فتح الملفات أو إنشاء إتصالات الإنترنت، ويمكن إستعامل جملة with مع أي كائن لديه التابعان __enter__ و __exit__ حيث يتم إستعمال هذه التوابع لفتح الملف على سبيل المثال وإغلاقه، وتكتب جملة with بالشكل التالي:

with expression [as variable]:
    with-block

لاحظ أن جزئية as في المثال السابق تستخدم لتخزين الإتصال في متغير من إختيارنا لكي نستطيع الكتابة أو القراءة من الملفات بإستخدام هذا المتغير كالتالي:

with open("example.txt", "w", encoding="utf-8") as f:
	f.write('hello, world!\n')

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

من مميزات جملة with أنها تغلق الإتصال مباشرة بعد إنتهاء الكود الذي بداخلها، ففي المثال السابق سوف يتم كتابة النص "Hello, world!" وبعدها سيتم إغلاق الملف بشكل مباشر، ولهذا يتم إستعمال with (لضمان أن الإتصال سوف يتم إغلاقه).

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

  • 1
نشر

أولاً as:
يتم استخدامها لإنشاء اسم مستعار

# بدون اسم مستعار
import numpy
a = numpy.array([2, 3, 4]) # array([2, 3, 4])
b=numpy.zeros((3, 4)) 
# مع استخدام اسم مستعار
import numpy as np
a = np.array([2, 3, 4]) # array([2, 3, 4])
b=np.zeros((3, 4)) 
# لاحظ ان استخدام اسم مستعار يكون أكثر أريحية خصوصاً عندما تتعدد الفروع  مثل المثال التالي
# بدون اسم مستعار
import tensorflow.keras.utils
tensorflow.keras.utils.plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)
# مع اسم مستعار
import tensorflow.keras.utils as pl
pl.plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)

ثانياً: with.
تم تقديم عبارة with لأول مرة منذ خمس سنوات، في Python 2.5.
تُستخدم with عند العمل مع موارد غير مُدارة "unmanaged resources" مثل file streams  Open network connections. Unmanaged memory ومع الأقفال Locks و ال sockets وال subprocesses.
 يسمح لك بالتأكد من "تنظيف" المورد عند انتهاء تشغيل الكود الذي يستخدمه، حتى إذا تم طرح استثناءات.
ففي حال استخدمتها مع الملفات فتتمثل ميزة استخدام عبارة with في ضمان إغلاق الملف بشكل آمن بغض النظر عن كيفية الخروج من الكتل البرمجية المتداخلة الموجودة لديك. بحيث إذا حدث استثناء قبل نهاية الكتلة البرمجية،  فسيتم إغلاق الملف بشكل مسبق بواسطة معالج استثناء خارجي. وإذا كانت الكتلة المتداخلة تحتوي على تعليمة return ، أو تعليمة continue أو break، فإن تعليمة with ستغلق الملف تلقائياً في تلك الحالات أيضاً. حيث تضمن عبارة with نفسها بالحصول على الموارد وتحريرها بالشكل المناسب.
يكون استخدامها مفيداً عندما يكون لديك عمليتان مترابطتان ترغب في تنفيذهما كزوج،  مع وجود كتلة من التعليمات البرمجية بينهما. المثال الكلاسيكي هو فتح ملف ومعالجة الملف ثم إغلاقه وهذا ماسنراه في المثال التالي:

# وبدون معالجة للاستثناءات التي قد تحدث with بدون استخدام 
f = open('path', 'w')
f.write('hsoub')
f.close()
# مع معالجة للاستثناءات التي قد تحدث with بدون استخدام 
f = open('path', 'w')
try:
    f.write('hsoub')
finally:
    f.close()
#with استخدام 
with open('path', 'w') as file:
    f.write('hsoub')

في أول مثال قد يؤدي حدوث استثناء أثناء استدعاء write إلى عدم إغلاق الملف بشكل سليم مما يؤدي إلى حدوث العديد من الأخطاء في الكود.
الطريقة الثانية في المثال أعلاه تهتم بجميع الاستثناءات ولكن استخدام تعليمة with يجعل الكود مضغوطاً وقابل للقراءة بشكل أكبر. وبالتالي ، تساعد العبارة في تجنب الأخطاء والتسريبات من خلال ضمان تحرير المورد بشكل صحيح عند تنفيذ التعليمات البرمجية التي تستخدم المورد بالكامل. ولاحظ أنك لن تحتاج لتعليمة close كما في أول حالتين.
يمكنك أيضاً استخدام تعليمة with مع كائنات معرفة من قبلك حيث يمكن استخدامها في الكائنات التي يحددها المستخدم وهذا مفيد بالنسبة لك لأن دعم عبارة with في العناصر الخاصة بك سيضمن عدم ترك أي مورد مفتوحًا أبدًا.
لاستخدامها مع الكائنات المعرفة من قبل المستخدم، تحتاج فقط إلى إضافة التوابع __enter __ () و __exit __ () في الكائن، مثال:

class wr(object):
    def __init__(self, file_name):
        self.file_name = file_name
    def __enter__(self):
        self.file = open(self.file_name, 'w')
        return self.file
    def __exit__(self):
        self.file.close()
#مع الكائن  with استخدام التعليمة 
with wr('file.txt') as f:
    f.write('hasoub')

إن الكلمة المفتاحية with تشكل باني ل wr، وبمجرد وصول التنفيذ لتعليمة with يتم إنشاء كائن من wr، ثم يقوم بايثون باستدعاء التابع enter الذي يقوم بتهيئة المورد الذي تريد أن تستخدمه في ال object الخاص بك، ويجب أن تقوم طريقة __enter __ () دائمًا بإرجاع واصف للمورد "descriptor"(مقبض للوصول للملف) الذي تم الحصول عليه.
يتم استخدام f للإشارة لل descriptor الذي تم الحصول عليه من التابع enter، ويتم وضع الكود البرمجي الذي يستخدم المورد بداخل كتلة with وبمجرد تنفيذ الكود الموجود داخل الكتلة with ، يتم استدعاء طريقة __exit __ () ليتم تحرير جميع الموارد.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...