<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>الماتلاب Matlab Archives - فيلم تعلم البرمجيات للطالب العربي</title>
	<atom:link href="https://arabdars.com/category/%D8%A7%D9%84%D9%85%D8%A7%D8%AA%D9%84%D8%A7%D8%A8-matlab/feed/" rel="self" type="application/rss+xml" />
	<link>https://arabdars.com/category/الماتلاب-matlab/</link>
	<description>Arab Dars</description>
	<lastBuildDate>Fri, 12 Feb 2021 04:41:05 +0000</lastBuildDate>
	<language>ar</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://arabdars.com/wp-content/uploads/cropped-fig2_low-32x32.png</url>
	<title>الماتلاب Matlab Archives - فيلم تعلم البرمجيات للطالب العربي</title>
	<link>https://arabdars.com/category/الماتلاب-matlab/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>علوم وتحليلات البيانات المتقدمة مع بايثون</title>
		<link>https://arabdars.com/%d8%b9%d9%84%d9%88%d9%85-%d9%88%d8%aa%d8%ad%d9%84%d9%8a%d9%84%d8%a7%d8%aa-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a7%d9%84%d9%85%d8%aa%d9%82%d8%af%d9%85%d8%a9-%d9%85%d8%b9-%d8%a8%d8%a7/</link>
		
		<dc:creator><![CDATA[Arab Dars]]></dc:creator>
		<pubDate>Fri, 12 Feb 2021 04:40:40 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<category><![CDATA[کتاب]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1946</guid>

					<description><![CDATA[<p>محتويات 1 لا يوجد وقت تضيعه: تحليل السلاسل الزمنية 1 1.1 السلاسل الزمنية 2 1.2 واحدًا تلو الآخر: بعض الأمثلة 4 1.3 تحمل مع الوقت: سلسلة Pandas 7 1.3.1 عمل السلاسل الزمنية للباندا 18 1.3.2 معالجة بيانات السلاسل الزمنية 21 1.4 نمذجة بيانات السلاسل الزمنية 31 1.4.1 الانحدار. . . (ليست فكرة جيدة؟ 34 1.4.2 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%b9%d9%84%d9%88%d9%85-%d9%88%d8%aa%d8%ad%d9%84%d9%8a%d9%84%d8%a7%d8%aa-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a7%d9%84%d9%85%d8%aa%d9%82%d8%af%d9%85%d8%a9-%d9%85%d8%b9-%d8%a8%d8%a7/">علوم وتحليلات البيانات المتقدمة مع بايثون</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div style="text-align: justify;"><span style="font-size: 16pt;">محتويات</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1 لا يوجد وقت تضيعه: تحليل السلاسل الزمنية 1</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.1 السلاسل الزمنية 2</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.2 واحدًا تلو الآخر: بعض الأمثلة 4</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.3 تحمل مع الوقت: سلسلة Pandas 7</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.3.1 عمل السلاسل الزمنية للباندا 18</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.3.2 معالجة بيانات السلاسل الزمنية 21</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.4 نمذجة بيانات السلاسل الزمنية 31</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.4.1 الانحدار. . . (ليست فكرة جيدة؟ 34</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.4.2 المتوسطات المتحركة والتجانس الأسي 36</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.4.3 الثباتية والموسمية 39</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.4.4 تحديد الثبات 42</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.4.5 الانحدار التلقائي إلى الإنقاذ 48</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.5 نماذج الانحدار التلقائي 51</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">1.6 ملخص 56</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">ثامنا ي. روجل سالازار</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2 التحدث بشكل طبيعي: معالجة النص واللغة الطبيعية 57</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.1 الصفحات والصفحات: الوصول إلى البيانات من الويب 59</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.1.1 حساء جميل في العمل 64</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.2 اجعل المنجم عاديًا: التعبيرات العادية 77</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.2.1 أنماط التعبير العادي 79</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.3 معالجة النص باستخدام Unicode 88</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.4 ترميز النص 96</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.5 تعليم الكلمات 102</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.6 ما الذي تتحدث عنه ؟: نمذجة الموضوع 109</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.6.1 تخصيص Dirichlet الكامن 110</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.6.2 LDA في العمل 115</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">2.7 ملخص 129</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3 التحوّل الاجتماعي: نظرية الرسم البياني وتحليل الشبكة الاجتماعية 131</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.1 التنشئة الاجتماعية بين الأصدقاء والأعداء 132</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.2 لنقم بإجراء اتصال: الرسوم البيانية والشبكات 140</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.2.1 أخذ المقياس: الدرجة والمركزية والمزيد 145</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.2.2 توصيل النقاط: خصائص الشبكة 149</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.3 الشبكات الاجتماعية مع Python: NetworkX 156</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.3.1 NetworkX: مقدمة سريعة 156</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.4 تحليل الشبكة الاجتماعية قيد التنفيذ 162</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.4.1 أطفال الكاراتيه: الصراع والانشطار في شبكة 162</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.4.2 في مجرة ​​بعيدة ، بعيدة: الشخصيات المركزية في شبكة 189</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">علم وتحليلات البيانات المتقدمة باستخدام python ix</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">3.5 ملخص 205</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4 التفكير بعمق: الشبكات العصبية والتعلم العميق 207</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.1 رحلة أسفل ممر الذاكرة 208</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.2 لا عقل: ما هي الشبكات العصبية؟ 214</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.2.1 معمارية الشبكة العصبية: الطبقات والعقد 215</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.2.2 إطلاق النار: الخلايا العصبية ، تنشيط! 218</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.2.3 التقدم للأمام وللخلف 223</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.3 الشبكات العصبية: من الألف إلى الياء 227</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.3.1 المضي قدمًا 229</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.3.2 تعلم المعلمات 232</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.3.3 الانتشار العكسي والانحدار المتدرج 234</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.3.4 الشبكة العصبية: أول تطبيق 243</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.4 الشبكات العصبية والتعلم العميق 254</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.4.1 الشبكات العصبية التلافيفية 263</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.4.2 الشبكات العصبية التلافيفية 268</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.4.3 الشبكات العصبية المتكررة 279</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.4.4 الذاكرة طويلة المدى 286</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.4.5 عمل شبكات الذاكرة طويلة المدى 290</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">4.5 ملخص 300</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">س ي. روجل سالازار</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5 هنا واحد صنعته سابقًا: نشر التعلم الآلي 303</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.1 الشيطان في التفاصيل: منتجات البيانات 304</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.2 التفاح والثعابين: Core ML + Python 309</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.3 التعلم الآلي في جوهره: التطبيقات و ML 313</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.3.1 خلق البيئة 314</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.3.2 إيني ، ميني ، ميني ، وزارة التربية: اختيار النموذج 315</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.3.3 الموقع والموقع والموقع: استكشاف البيانات 317</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.3.4 النمذجة والتعلم الأساسي: خطوة حاسمة 322</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.3.5 خصائص النموذج في Core ML 329</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.4 مفاجأة وسعادة: إنشاء تطبيق iOS 331</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.4.1 مشروع جديد: Xcode 332</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.4.2 ادفع الأزرار الخاصة بي: إضافة الوظيفة 344</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.4.3 الإنتقاء: The Picker View 347</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.4.4 سلوك النموذج: Core ML + SwiftUI 350</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">5.5 ملخص 355</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">359ـ مـحـمـســه</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">361- محلول مناديل</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">ج ـ وظيفة سوفت ماكس ومشتقاتها 363</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">ج 1 الاستقرار العددي 365</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">علم وتحليلات البيانات المتقدمة باستخدام Python xi</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">د مشتق دالة الخسارة عبر الانتروبيا 367</span></div>
<div style="text-align: justify;"><span style="font-size: 16pt;">369- مسعود</span></div>
<div style="text-align: justify;">
<p><span style="font-size: 16pt;">الفهرس 379</span></p>
</div>
<p style="text-align: center;"><a href="http://www.mediafire.com/file/v4pgpkmicimvdqq/book049.rar/file" target="_blank" rel="noopener"><span style="font-size: 16pt;">رابط التحميل</span></a></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%b9%d9%84%d9%88%d9%85-%d9%88%d8%aa%d8%ad%d9%84%d9%8a%d9%84%d8%a7%d8%aa-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a7%d9%84%d9%85%d8%aa%d9%82%d8%af%d9%85%d8%a9-%d9%85%d8%b9-%d8%a8%d8%a7/">علوم وتحليلات البيانات المتقدمة مع بايثون</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>تصميم وتحسين الأنظمة الحرارية باستخدام تطبيقات MATLAB</title>
		<link>https://arabdars.com/%d8%aa%d8%b5%d9%85%d9%8a%d9%85-%d9%88%d8%aa%d8%ad%d8%b3%d9%8a%d9%86-%d8%a7%d9%84%d8%a3%d9%86%d8%b8%d9%85%d8%a9-%d8%a7%d9%84%d8%ad%d8%b1%d8%a7%d8%b1%d9%8a%d8%a9-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af/</link>
		
		<dc:creator><![CDATA[Arab Dars]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 07:11:02 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1791</guid>

					<description><![CDATA[<p>تصميم الأنظمة الحرارية وتحسينها ، الإصدار الثالث: توفر تطبيقات MATLAB أساليب منهجية وفعالة لتصميم الأنظمة الحرارية ، والتي تهم مجموعة واسعة من التطبيقات. يقدم المفاهيم والإجراءات الأساسية للتصميم المفاهيمي ، وصياغة المشكلة ، والنمذجة ، والمحاكاة ، وتقييم التصميم ، وتحقيق التصميم الممكن ، والتحسين. مع التركيز على النمذجة والمحاكاة ، مع التجريب للرؤية المادية [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%aa%d8%b5%d9%85%d9%8a%d9%85-%d9%88%d8%aa%d8%ad%d8%b3%d9%8a%d9%86-%d8%a7%d9%84%d8%a3%d9%86%d8%b8%d9%85%d8%a9-%d8%a7%d9%84%d8%ad%d8%b1%d8%a7%d8%b1%d9%8a%d8%a9-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af/">تصميم وتحسين الأنظمة الحرارية باستخدام تطبيقات MATLAB</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-size: 22pt;">تصميم الأنظمة الحرارية وتحسينها ، الإصدار الثالث: توفر تطبيقات MATLAB أساليب منهجية وفعالة لتصميم الأنظمة الحرارية ، والتي تهم مجموعة واسعة من التطبيقات. </span></p>
<p style="text-align: justify;"><span style="font-size: 22pt;">يقدم المفاهيم والإجراءات الأساسية للتصميم المفاهيمي ، وصياغة المشكلة ، والنمذجة ، والمحاكاة ، وتقييم التصميم ، وتحقيق التصميم الممكن ، والتحسين. مع التركيز على النمذجة والمحاكاة ، مع التجريب للرؤية المادية والتحقق من صحة النموذج ، تغطي الطبعة الثالثة مجالات اختيار المواد ، وقابلية التصنيع ، والجوانب الاقتصادية ، والحساسية ، وطرق البحث الجينية والتدرجية ، ومنهجية التصميم القائم على المعرفة ، وعدم اليقين ، والجوانب الأخرى التي تنشأ في المواقف العملية. </span></p>
<p style="text-align: justify;"><span style="font-size: 22pt;">يتميز هذا الإصدار بالعديد من الأمثلة والمشكلات الجديدة والمنقحة من مجالات التطبيق المتنوعة وتغطية أكثر شمولاً للتحليل والمحاكاة باستخدام MATLAB .</span></p>
<p>&nbsp;</p>
<p style="text-align: center;"><span style="font-size: 32pt;"><a href="http://www.mediafire.com/file/1wrcr901fpyhg53/ArabBook012_%255Barabdars.com%255D.rar/file" target="_blank" rel="noopener noreferrer">download</a></span></p>
<p><iframe class="ginger-extension-definitionpopup" style="display: none;"></iframe></p>
<p>&nbsp;</p>
<p><iframe class="ginger-extension-definitionpopup" style="left: 302.5px; top: 294px; z-index: 2147483646; display: none;" src="chrome-extension://kdfieneakcjfaiglcfcgkidlkmlijjnh/content/popups/definitionPopup/index.html?title=download&amp;description=transfer%20a%20file%20or%20program%20from%20a%20central%20computer%20to%20a%20smaller%20computer%20or%20to%20a%20computer%20at%20a%20remote%20location"></iframe></p>
<p>&nbsp;</p>
<p><iframe class="ginger-extension-definitionpopup" style="left: 302.5px; top: 284px; z-index: 2147483646; display: none;" src="chrome-extension://kdfieneakcjfaiglcfcgkidlkmlijjnh/content/popups/definitionPopup/index.html?title=download&amp;description=transfer%20a%20file%20or%20program%20from%20a%20central%20computer%20to%20a%20smaller%20computer%20or%20to%20a%20computer%20at%20a%20remote%20location"></iframe></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%aa%d8%b5%d9%85%d9%8a%d9%85-%d9%88%d8%aa%d8%ad%d8%b3%d9%8a%d9%86-%d8%a7%d9%84%d8%a3%d9%86%d8%b8%d9%85%d8%a9-%d8%a7%d9%84%d8%ad%d8%b1%d8%a7%d8%b1%d9%8a%d8%a9-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af/">تصميم وتحسين الأنظمة الحرارية باستخدام تطبيقات MATLAB</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>التعرف على الأنماط وتقنيات الذكاء الحسابي باستخدام MATLAB</title>
		<link>https://arabdars.com/%d8%a7%d9%84%d8%aa%d8%b9%d8%b1%d9%81-%d8%b9%d9%84%d9%89-%d8%a7%d9%84%d8%a3%d9%86%d9%85%d8%a7%d8%b7-%d9%88%d8%aa%d9%82%d9%86%d9%8a%d8%a7%d8%aa-%d8%a7%d9%84%d8%b0%d9%83%d8%a7%d8%a1-%d8%a7%d9%84%d8%ad/</link>
		
		<dc:creator><![CDATA[Arab Dars]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 06:00:09 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1785</guid>

					<description><![CDATA[<p>يقدم هذا الكتاب الموضوع المعقد المتمثل في استخدام الذكاء الحسابي للتعرف على الأنماط بطريقة مباشرة وقابلة للتطبيق ، باستخدام Matlab لتوضيح الموضوعات والمفاهيم. يغطي المؤلف أدوات الذكاء الحسابي مثل تحسين سرب الجسيمات والبحث البكتيري والتليين المحاكي والخوارزمية الجينية والشبكات العصبية الاصطناعية. يتم تقديم الرسوم التوضيحية المستندة إلى Matlab جنبًا إلى جنب مع الكود لكل موضوع. [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%a7%d9%84%d8%aa%d8%b9%d8%b1%d9%81-%d8%b9%d9%84%d9%89-%d8%a7%d9%84%d8%a3%d9%86%d9%85%d8%a7%d8%b7-%d9%88%d8%aa%d9%82%d9%86%d9%8a%d8%a7%d8%aa-%d8%a7%d9%84%d8%b0%d9%83%d8%a7%d8%a1-%d8%a7%d9%84%d8%ad/">التعرف على الأنماط وتقنيات الذكاء الحسابي باستخدام MATLAB</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-size: 18pt;">يقدم هذا الكتاب الموضوع المعقد المتمثل في استخدام الذكاء الحسابي للتعرف على الأنماط بطريقة مباشرة وقابلة للتطبيق ، باستخدام Matlab لتوضيح الموضوعات والمفاهيم. يغطي المؤلف أدوات الذكاء الحسابي مثل تحسين سرب الجسيمات والبحث البكتيري والتليين المحاكي والخوارزمية الجينية والشبكات العصبية الاصطناعية. يتم تقديم الرسوم التوضيحية المستندة إلى Matlab جنبًا إلى جنب مع الكود لكل موضوع. يحصل القراء على فهم أساسي سريع لتقنيات التعرف على الأنماط المختلفة باستخدام العمق المطلوب فقط في الرياضيات. يتم تقديم برنامج وخوارزمية Matlab جنبًا إلى جنب مع النص الجاري ، مما يوفر الوضوح والفائدة للتقنيات المختلفة.</span></p>
<p>&nbsp;</p>
<p style="text-align: justify;"><span style="font-size: 18pt;">يقدم التعرف على الأنماط والذكاء الحسابي باستخدام Matlab ؛ يتضمن مزيجًا من النظرية والرياضيات والخوارزميات ، مما يتيح للقراء فهم المفاهيم بسرعة ؛ يحدد مجموعة من المصنفات ونماذج الانحدار المختلفة والاختبارات الإحصائية وتقنيات التعرف على الأنماط باستخدام الذكاء الحسابي.</span></p>
<p>&nbsp;</p>
<h2 style="text-align: justify;"><span style="font-size: 16pt;">جدول المحتويات :</span></h2>
<p style="text-align: justify;"><span style="font-size: 18pt;">المقدمة &#8230; الصفحات من الأول إلى الثالث عشر</span><br />
<span style="font-size: 18pt;">تقنيات تقليل الأبعاد &#8230;. الصفحات 1-29</span><br />
<span style="font-size: 18pt;">تقنيات المصنف الخطي &#8230;. الصفحات 31-67</span><br />
<span style="font-size: 18pt;">تقنيات الانحدار &#8230;. الصفحات 69-120</span><br />
<span style="font-size: 18pt;">المصنف الاحتمالي الخاضع للإشراف والتكتل غير الخاضع للإشراف &#8230;. الصفحات 121-163</span><br />
<span style="font-size: 18pt;">الذكاء الحسابي &#8230;. الصفحات 165-228</span><br />
<span style="font-size: 18pt;">اختبار إحصائي للتعرف على الأنماط &#8230;. الصفحات 229-249</span><br />
<span style="font-size: 18pt;">العودة &#8230; الصفحات 251-256</span></p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www.mediafire.com/file/wffga4171nexnkv/ArabBook011_%255Barabdars.com%255D.rar/file" target="_blank" rel="noopener noreferrer"><span style="font-size: 24pt;">download</span></a><iframe class="ginger-extension-definitionpopup" style="display: none;"></iframe></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><iframe class="ginger-extension-definitionpopup" style="display: none;"></iframe></p>
<p>&nbsp;</p>
<p><iframe class="ginger-extension-definitionpopup" style="left: 302.5px; top: 706.156px; z-index: 2147483646; display: none;" src="chrome-extension://kdfieneakcjfaiglcfcgkidlkmlijjnh/content/popups/definitionPopup/index.html?title=download&amp;description=transfer%20a%20file%20or%20program%20from%20a%20central%20computer%20to%20a%20smaller%20computer%20or%20to%20a%20computer%20at%20a%20remote%20location"></iframe></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%a7%d9%84%d8%aa%d8%b9%d8%b1%d9%81-%d8%b9%d9%84%d9%89-%d8%a7%d9%84%d8%a3%d9%86%d9%85%d8%a7%d8%b7-%d9%88%d8%aa%d9%82%d9%86%d9%8a%d8%a7%d8%aa-%d8%a7%d9%84%d8%b0%d9%83%d8%a7%d8%a1-%d8%a7%d9%84%d8%ad/">التعرف على الأنماط وتقنيات الذكاء الحسابي باستخدام MATLAB</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>تحسين مشاكل نظام الطاقة: الطرق والخوارزميات و رموز MATLAB</title>
		<link>https://arabdars.com/%d8%aa%d8%ad%d8%b3%d9%8a%d9%86-%d9%85%d8%b4%d8%a7%d9%83%d9%84-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%b7%d8%a7%d9%82%d8%a9-%d8%a7%d9%84%d8%b7%d8%b1%d9%82-%d9%88%d8%a7%d9%84%d8%ae%d9%88%d8%a7%d8%b1/</link>
		
		<dc:creator><![CDATA[Arab Dars]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 05:49:32 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1782</guid>

					<description><![CDATA[<p>يقدم هذا الكتاب طرق التحسين المتكاملة والخوارزميات لمشاكل نظام الطاقة جنبًا إلى جنب مع أكوادها في MATLAB. يعد توفير نظام طاقة وطاقة موثوق به وآمن أحد التحديات الرئيسية في العصر الجديد. نظرًا للطبيعة متعددة الأهداف غير الخطية لهذه المشكلات ، فإن الطرق التقليدية ليست مناهج مناسبة لحل معضلات تشغيل نظام الطاقة على نطاق واسع. تمت [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%aa%d8%ad%d8%b3%d9%8a%d9%86-%d9%85%d8%b4%d8%a7%d9%83%d9%84-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%b7%d8%a7%d9%82%d8%a9-%d8%a7%d9%84%d8%b7%d8%b1%d9%82-%d9%88%d8%a7%d9%84%d8%ae%d9%88%d8%a7%d8%b1/">تحسين مشاكل نظام الطاقة: الطرق والخوارزميات و رموز MATLAB</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-size: 24pt;">يقدم هذا الكتاب طرق التحسين المتكاملة والخوارزميات لمشاكل نظام الطاقة جنبًا إلى جنب مع أكوادها في MATLAB. </span></p>
<p style="text-align: justify;"><span style="font-size: 24pt;">يعد توفير نظام طاقة وطاقة موثوق به وآمن أحد التحديات الرئيسية في العصر الجديد. نظرًا للطبيعة متعددة الأهداف غير الخطية لهذه المشكلات ، فإن الطرق التقليدية ليست مناهج مناسبة لحل معضلات تشغيل نظام الطاقة على نطاق واسع. </span></p>
<p style="text-align: justify;"><span style="font-size: 24pt;">تمت مناقشة تكامل خوارزميات التحسين في أنظمة الطاقة في العديد من الكتب المدرسية ، ولكن هذا هو الأول الذي يتضمن طرق التكامل والرموز المطورة. </span></p>
<p style="text-align: justify;"><span style="font-size: 24pt;">على هذا النحو ، فهو مورد مفيد للطلاب الجامعيين والخريجين والباحثين والمهندسين الذين يحاولون حل مشاكل تحسين الطاقة والطاقة باستخدام الأنظمة التقنية والذكية الحديثة القائمة على دراسات الحالة النظرية والتطبيق. من المتوقع أن يتمتع القراء بخلفية رياضية أساسية.</span></p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www.mediafire.com/file/eeycdhpldbeyd91/ArabBook010_%255Barabdars.com%255D.rar/file" target="_blank" rel="noopener noreferrer"><span style="font-size: 32pt;">download</span></a></p>
<p>&nbsp;</p>
<p><iframe class="ginger-extension-definitionpopup" style="left: 302.5px; top: 411px; z-index: 2147483646; display: none;" src="chrome-extension://kdfieneakcjfaiglcfcgkidlkmlijjnh/content/popups/definitionPopup/index.html?title=download&amp;description=transfer%20a%20file%20or%20program%20from%20a%20central%20computer%20to%20a%20smaller%20computer%20or%20to%20a%20computer%20at%20a%20remote%20location"></iframe></p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%aa%d8%ad%d8%b3%d9%8a%d9%86-%d9%85%d8%b4%d8%a7%d9%83%d9%84-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%b7%d8%a7%d9%82%d8%a9-%d8%a7%d9%84%d8%b7%d8%b1%d9%82-%d9%88%d8%a7%d9%84%d8%ae%d9%88%d8%a7%d8%b1/">تحسين مشاكل نظام الطاقة: الطرق والخوارزميات و رموز MATLAB</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>فهم بديهي لتصفية كالمان باستخدام MATLAB</title>
		<link>https://arabdars.com/%d9%81%d9%87%d9%85-%d8%a8%d8%af%d9%8a%d9%87%d9%8a-%d9%84%d8%aa%d8%b5%d9%81%d9%8a%d8%a9-%d9%83%d8%a7%d9%84%d9%85%d8%a7%d9%86-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-matlab/</link>
		
		<dc:creator><![CDATA[Arab Dars]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 05:45:43 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1780</guid>

					<description><![CDATA[<p>أدى ظهور أجهزة الاستشعار الدقيقة ذات الأسعار المعقولة ، مثل أنظمة القياس بالقصور الذاتي MEMS ، والتي يتم تطبيقها في الأنظمة المضمنة وأجهزة إنترنت الأشياء ، إلى جلب تقنيات مثل ترشيح كالمان ، القادرة على دمج المعلومات من أجهزة استشعار أو مصادر متعددة ، إلى الاهتمام من الطلاب والهواة. سيعمل هذا الكتاب على تطوير المفاهيم [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d9%81%d9%87%d9%85-%d8%a8%d8%af%d9%8a%d9%87%d9%8a-%d9%84%d8%aa%d8%b5%d9%81%d9%8a%d8%a9-%d9%83%d8%a7%d9%84%d9%85%d8%a7%d9%86-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-matlab/">فهم بديهي لتصفية كالمان باستخدام MATLAB</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-size: 16pt;">أدى ظهور أجهزة الاستشعار الدقيقة ذات الأسعار المعقولة ، مثل أنظمة القياس بالقصور الذاتي MEMS ، والتي يتم تطبيقها في الأنظمة المضمنة وأجهزة إنترنت الأشياء ، إلى جلب تقنيات مثل ترشيح كالمان ، القادرة على دمج المعلومات من أجهزة استشعار أو مصادر متعددة ، إلى الاهتمام من الطلاب والهواة. </span></p>
<p style="text-align: justify;"><span style="font-size: 16pt;">سيعمل هذا الكتاب على تطوير المفاهيم الأساسية الضرورية فقط ، مما يساعد جمهورًا أكبر بكثير من القراء على تطوير فهم وحدس سيمكنهم من متابعة شرح خوارزمية ترشيح كالمان. </span></p>
<p style="text-align: justify;"><span style="font-size: 16pt;">الميزات الرئيسية: يوفر فهمًا بديهيًا لنهج ترشيح كالمان نظرة عامة موجزة للمفاهيم لتعزيز إمكانية الوصول وجذب جمهور عريض تقنيات التعلم التفاعلية مع أمثلة التعليمات البرمجية</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>المقدمة</h2>
<p style="text-align: justify;"><span style="font-size: 16pt;">يوفر مرشح كالمان ، الذي تصوره الدكتور رودولف إي. هذا نوع شائع من المواقف في دراسة العديد من الأنظمة الديناميكية العملية ، في مجالات متنوعة.</span><br />
<span style="font-size: 16pt;">كان لمرشح كالمان تأثير مهم على التقدم في المجالات المتعلقة بملاحة السفن والطائرات والمركبات الفضائية. في مجالات الاستخدام الأولية هذه ، تم استخدام مرشح Kalman بشكل حصري تقريبًا لتطبيقات محددة للغاية ، من قبل مجموعة صغيرة جدًا من المستخدمين المتخصصين للغاية. ومع ذلك ، في القرن الحادي والعشرين ، أدى تطبيقه المحتمل على الروبوتات الصغيرة والمركبات المصغرة بدون طيار إلى توسيع نطاق جاذبية نهج التقدير القوي هذا لجمهور أوسع بكثير. علاوة على ذلك ، فإن الظهور الأخير لوحدات القياس بالقصور الذاتي المصغرة الرخيصة (IMUs) أو وحدات الاستشعار المغناطيسية والمعدل الزاوي والجاذبية (MARG) في التطبيقات المعاصرة قد زاد من أهمية تقنيات مثل ترشيح كالمان ، القادرة على دمج المعلومات من أجهزة استشعار متعددة. بالطبع ، كل هذه التطبيقات المعاصرة تعمل البيانات الرقمية ، وعلى هذا النحو ، يتم تناولها بواسطة عامل تصفية منفصل كالمان ، وهو موضوع هذا الكتاب.</span><br />
<span style="font-size: 16pt;">هذا الكتاب هو جهدنا لتزويد ذلك الجمهور الأوسع بعرض تقديمي لمرشح كالمان الذي لا يمثل مجرد قائمة &#8220;كتاب طبخ&#8221; من الخطوات (والتي قد تؤدي إلى استخدام دون المستوى الأمثل لهذه الأداة المهمة) ، مع عدم مطالبة القارئ خاض العديد من البراهين الرسمية لإنجاز اشتقاق صارم للخوارزمية. هذه البراهين قدمها كالمان في ورقته البحثية عام 1960 وآخرين درسوا القضية من منظور رسمي منذ ذلك الحين.</span></p>
<p style="text-align: center;"><a href="http://www.mediafire.com/file/u9msf0pkw044m7z/ArabBook009.rar/file" target="_blank" rel="noopener noreferrer"><span style="font-size: 20pt;">download</span></a></p>
<p><iframe class="ginger-extension-definitionpopup" style="left: 302.5px; top: 745.156px; z-index: 2147483646; display: none;" src="chrome-extension://kdfieneakcjfaiglcfcgkidlkmlijjnh/content/popups/definitionPopup/index.html?title=download&amp;description=transfer%20a%20file%20or%20program%20from%20a%20central%20computer%20to%20a%20smaller%20computer%20or%20to%20a%20computer%20at%20a%20remote%20location"></iframe></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d9%81%d9%87%d9%85-%d8%a8%d8%af%d9%8a%d9%87%d9%8a-%d9%84%d8%aa%d8%b5%d9%81%d9%8a%d8%a9-%d9%83%d8%a7%d9%84%d9%85%d8%a7%d9%86-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-matlab/">فهم بديهي لتصفية كالمان باستخدام MATLAB</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ميتاكلاس بايثون</title>
		<link>https://arabdars.com/%d9%85%d9%8a%d8%aa%d8%a7%d9%83%d9%84%d8%a7%d8%b3-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/</link>
		
		<dc:creator><![CDATA[Reyhane]]></dc:creator>
		<pubDate>Mon, 21 Sep 2020 16:52:03 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1631</guid>

					<description><![CDATA[<p>جدول المحتويات الطراز القديم مقابل فئات الطراز الجديد فئات الطراز القديم فئات جديدة الطراز النوع والفئة تعريف الفصل ديناميكيًا مثال 1 مثال 2 مثال 3 مثال 4 Metaclass مخصص هل هذا حقا ضروري؟ خاتمة يشير مصطلح metaprogramming إلى إمكانية حصول البرنامج على معرفة أو التلاعب بنفسه. تدعم Python شكلاً من أشكال البرمجة الوصفية للفئات تسمى [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d9%85%d9%8a%d8%aa%d8%a7%d9%83%d9%84%d8%a7%d8%b3-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/">ميتاكلاس بايثون</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span style="font-size: 20pt"><strong>جدول المحتويات</strong></span><br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الطراز القديم مقابل فئات الطراز الجديد<br />
فئات الطراز القديم<br />
فئات جديدة الطراز<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">النوع والفئة<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تعريف الفصل ديناميكيًا<br />
مثال 1<br />
مثال 2<br />
مثال 3<br />
مثال 4<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">Metaclass مخصص<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هل هذا حقا ضروري؟<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">خاتمة<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يشير مصطلح metaprogramming إلى إمكانية حصول البرنامج على معرفة أو التلاعب بنفسه. تدعم Python شكلاً من أشكال البرمجة الوصفية للفئات تسمى metaclasses.</p>
<p>Metaclasses هي مفهوم OOP مقصور على فئة معينة ، كامنة وراء كل كود Python تقريبًا. أنت تستخدمها سواء كنت على علم بذلك أم لا. بالنسبة للجزء الأكبر ، لا تحتاج إلى أن تكون على دراية بذلك. نادرًا ما يفكر معظم مبرمجي بايثون في الفوقية.</p>
<p>ومع ذلك ، عندما تظهر الحاجة ، توفر Python قدرة لا تدعمها جميع اللغات الموجهة للكائنات: يمكنك الحصول على الغطاء وتحديد الفئات الوصفية المخصصة. يعد استخدام metaclasses المخصص مثيرًا للجدل إلى حد ما ، كما هو مقترح في الاقتباس التالي من Tim Peters ، معلم Python الذي قام بتأليف Zen of Python:<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">&#8220;Metaclasses هي سحر أعمق مما ينبغي أن يقلق بشأنه 99٪ من المستخدمين. إذا كنت تتساءل عما إذا كنت بحاجة إليها ، فأنت لست (الأشخاص الذين يحتاجون إليها بالفعل يعرفون على وجه اليقين أنهم بحاجة إليهم ، ولا يحتاجون إلى تفسير لماذا) &#8220;.</p>
<p>&#8211; تيم بيترز</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هناك Pythonistas (كما هو معروف هواة Python) الذين يعتقدون أنه لا يجب عليك استخدام metaclasses المخصصة. قد يكون هذا بعيدًا بعض الشيء ، ولكن ربما يكون صحيحًا أن الفئات الوصفية المخصصة ليست ضرورية في الغالب. إذا لم يكن من الواضح تمامًا أن المشكلة تستدعيها ، فمن المحتمل أن تكون أنظف وأكثر قابلية للقراءة إذا تم حلها بطريقة أبسط.</p>
<p>ومع ذلك ، فإن فهم Python metaclasses مفيد ، لأنه يؤدي إلى فهم أفضل للداخلية في صفوف Python بشكل عام. أنت لا تعرف أبدًا: قد تجد نفسك يومًا ما في واحدة من تلك المواقف التي تعرف فيها فقط أن metaclass المخصص هو ما تريده.</p>
<p><span style="font-size: 20pt"><strong>الطراز القديم مقابل فئات الطراز الجديد</strong></span></p>
<p>في عالم بايثون ، يمكن أن يكون الفصل واحدًا من نوعين. لم يتم تحديد أي مصطلحات رسمية ، لذلك يشار إليها بشكل غير رسمي على أنها فصول من الطراز القديم والأسلوب الجديد.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>فئات الطراز القديم</strong></p>
<p>في الفصول ذات النمط القديم ، لا يكون الفصل والنوع نفس الشيء تمامًا. يتم دائمًا تنفيذ مثيل لفئة ذات نمط قديم من نوع مضمن واحد يسمى مثيل. إذا كان obj مثيلًا لفئة ذات نمط قديم ، فإن obj .__ class__ تحدد الفئة ، لكن النوع (obj) هو دائمًا مثيل. المثال التالي مأخوذ من Python 2.7:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="vm">__class__</span>
<span class="go">&lt;class __main__.Foo at 0x000000000535CC48&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="go">&lt;type 'instance'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>فئات جديدة الطراز</strong></p>
<p>توحد الفصول ذات النمط الجديد مفاهيم الفئة والنوع. إذا كان obj مثيلًا لفئة ذات نمط جديد ، فإن النوع (obj) هو نفسه obj .__ class__:<br />
</span></p>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span>
<span class="go">&lt;class '__main__.Foo'&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="go">&lt;class '__main__.Foo'&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="go">True</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">n</span> <span class="o">=</span> <span class="mi">5</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">d</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'x'</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'y'</span> <span class="p">:</span> <span class="mi">2</span> <span class="p">}</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">is</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
<span class="gp">...</span>
<span class="go">True</span>
<span class="go">True</span>
<span class="go">True</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">النوع والفئة</span></strong></p>
<p>في Python 3 ، كل الفئات هي فئات جديدة. وبالتالي ، في Python 3 ، من المعقول الإشارة إلى نوع الكائن وفئته بالتبادل.<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ملاحظة: في Python 2 ، تكون الفئات هي النمط القديم افتراضيًا. قبل Python 2.2 ، لم تكن الفئات ذات النمط الجديد مدعومة على الإطلاق. من Python 2.2 فصاعدًا ، يمكن إنشاؤها ولكن يجب الإعلان عنها صراحة على أنها نمط جديد.</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تذكر أن كل شيء في بايثون هو كائن. الفئات هي كائنات أيضًا. نتيجة لذلك ، يجب أن يكون للفصل نوع. ما هو نوع الفصل؟</p>
<p>ضع في اعتبارك ما يلي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>

<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="go">&lt;class '__main__.Foo'&gt;</span>

<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">Foo</span><span class="p">)</span>
<span class="go">&lt;class 'type'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">نوع x هو فئة Foo ، كما تتوقع. لكن نوع Foo ، الفئة نفسها ، هي النوع. بشكل عام ، نوع أي فئة ذات نمط جديد هو النوع.</p>
<p>نوع الفصول المضمنة التي تعرفها هو أيضًا نوع:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">dict</span><span class="p">,</span> <span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">:</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
<span class="gp">...</span>
<span class="go">&lt;class 'type'&gt;</span>
<span class="go">&lt;class 'type'&gt;</span>
<span class="go">&lt;class 'type'&gt;</span>
<span class="go">&lt;class 'type'&gt;</span>
<span class="go">&lt;class 'type'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لهذه المسألة ، نوع النوع هو النوع أيضًا (نعم ، حقًا):<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="nb">type</span><span class="p">)</span>
<span class="go">&lt;class 'type'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">النوع هو metaclass ، والفئات هي أمثلة. تمامًا كما أن الكائن العادي هو مثيل لفئة ، فإن أي فئة ذات نمط جديد في Python ، وبالتالي أي فئة في Python 3 ، هي مثيل من النوع metaclass.</p>
<p>في الحالة أعلاه:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">x هو مثيل للفئة Foo.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">Foo هو مثيل من النوع metaclass.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">النوع هو أيضًا مثيل من النوع metaclass ، لذا فهو مثيل لنفسه.<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span style="font-size: 20pt"><strong>تعريف الفصل ديناميكيًا</strong></span></p>
<p>دالة type () المضمنة ، عند تمرير وسيطة واحدة ، ترجع نوع الكائن. بالنسبة لفئات النمط الجديد ، يكون هذا بشكل عام هو نفسه سمة __class__ للكائن:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="go">&lt;class 'int'&gt;</span>

<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">([</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">,</span> <span class="s1">'baz'</span><span class="p">])</span>
<span class="go">&lt;class 'list'&gt;</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">t</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
<span class="go">&lt;class 'tuple'&gt;</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">Foo</span><span class="p">())</span>
<span class="go">&lt;class '__main__.Foo'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكنك أيضًا استدعاء النوع () بثلاث وسيطات &#8211; النوع (&lt;name&gt; ، &lt;bases&gt; ، &lt;dct&gt;):<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">&lt;name&gt; يحدد اسم الفئة. تصبح هذه سمة __name__ للفئة.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يحدد &lt;bases&gt; مجموعة من الفئات الأساسية التي ترث منها الفئة. تصبح هذه السمة __bases__ للفصل.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يحدد &lt;dct&gt; قاموس مساحة اسم يحتوي على تعريفات لجسم الفئة. تصبح هذه سمة __dict__ للطبقة.<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يؤدي استدعاء type () بهذه الطريقة إلى إنشاء مثيل جديد من النوع metaclass. بمعنى آخر ، يتم إنشاء فئة جديدة ديناميكيًا.</p>
<p>في كل من الأمثلة التالية ، يُعرِّف المقتطف العلوي فئة ديناميكيًا بالنوع () ، بينما يُعرِّف المقتطف أدناه الفئة بالطريقة المعتادة ، باستخدام عبارة الفئة. في كل حالة ، المقتطفان متكافئان وظيفيًا.<br />
</span></p>
<p><strong><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">مثال </span></strong><strong><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">1</span></strong></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في هذا المثال الأول ، تكون الوسيطات &lt;bases&gt; و &lt;dct&gt; التي تم تمريرها إلى النوع () فارغة. لم يتم تحديد وراثة من أي فئة أصل ، ولا يتم وضع أي شيء مبدئيًا في قاموس مساحة الاسم. هذا هو أبسط تعريف ممكن للفئة:<br />
</span></p>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">Foo</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="s1">'Foo'</span><span class="p">,</span> <span class="p">(),</span> <span class="p">{})</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span>
<span class="go">&lt;__main__.Foo object at 0x04CFAD50&gt;</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span>
<span class="go">&lt;__main__.Foo object at 0x0370AD50&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>مثال 2</strong></p>
<p>هنا ، &lt;bases&gt; عبارة عن مجموعة تحتوي على عنصر واحد Foo ، تحدد الفئة الرئيسية التي يرث Bar منها. يتم وضع السمة ، Attr ، في البداية في قاموس مساحة الاسم:<br />
</span></p>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">Bar</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="s1">'Bar'</span><span class="p">,</span> <span class="p">(</span><span class="n">Foo</span><span class="p">,),</span> <span class="nb">dict</span><span class="p">(</span><span class="n">attr</span><span class="o">=</span><span class="mi">100</span><span class="p">))</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Bar</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="vm">__class__</span>
<span class="go">&lt;class '__main__.Bar'&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__bases__</span>
<span class="go">(&lt;class '__main__.Foo'&gt;,)</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Bar</span><span class="p">(</span><span class="n">Foo</span><span class="p">):</span>
<span class="gp">... </span>    <span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Bar</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="vm">__class__</span>
<span class="go">&lt;class '__main__.Bar'&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__bases__</span>
<span class="go">(&lt;class '__main__.Foo'&gt;,)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>مثال 3</strong></p>
<p>هذه المرة ، أصبحت &lt;bases&gt; فارغة مرة أخرى. يتم وضع كائنين في قاموس مساحة الاسم عبر الوسيطة &lt;dct&gt;. الأول هو سمة تسمى attr والثاني وظيفة تسمى attr_val ، والتي تصبح طريقة للفئة المحددة:<br />
</span></p>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">Foo</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span>
<span class="gp">... </span>    <span class="s1">'Foo'</span><span class="p">,</span>
<span class="gp">... </span>    <span class="p">(),</span>
<span class="gp">... </span>    <span class="p">{</span>
<span class="gp">... </span>        <span class="s1">'attr'</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
<span class="gp">... </span>        <span class="s1">'attr_val'</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">x</span> <span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">attr</span>
<span class="gp">... </span>    <span class="p">}</span>
<span class="gp">... </span><span class="p">)</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr_val</span><span class="p">()</span>
<span class="go">100</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">... </span>    <span class="k">def</span> <span class="nf">attr_val</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span>        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr_val</span><span class="p">()</span>
<span class="go">100</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>مثال 4</strong></p>
<p>يمكن تعريف الوظائف البسيطة جدًا فقط باستخدام lambda في Python. في المثال التالي ، يتم تعريف دالة أكثر تعقيدًا من الخارج ثم يتم تعيينها إلى attr_val في قاموس مساحة الاسم عبر الاسم f:<br />
</span></p>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="s1">'attr ='</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">attr</span><span class="p">)</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Foo</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span>
<span class="gp">... </span>    <span class="s1">'Foo'</span><span class="p">,</span>
<span class="gp">... </span>    <span class="p">(),</span>
<span class="gp">... </span>    <span class="p">{</span>
<span class="gp">... </span>        <span class="s1">'attr'</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
<span class="gp">... </span>        <span class="s1">'attr_val'</span><span class="p">:</span> <span class="n">f</span>
<span class="gp">... </span>    <span class="p">}</span>
<span class="gp">... </span><span class="p">)</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr_val</span><span class="p">()</span>
<span class="go">attr = 100</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="s1">'attr ='</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">attr</span><span class="p">)</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">... </span>    <span class="n">attr_val</span> <span class="o">=</span> <span class="n">f</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr_val</span><span class="p">()</span>
<span class="go">attr = 100</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">Metaclass مخصص</span></strong></p>
<p>ضع في اعتبارك مرة أخرى هذا المثال البالي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ينشئ التعبير Foo () مثيلًا جديدًا للفئة Foo. عندما يواجه المترجم Foo () ، يحدث ما يلي:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يتم استدعاء طريقة __call __ () لفئة Foo الرئيسية. نظرًا لأن Foo هي فئة نمطية جديدة قياسية ، فإن صنفها الرئيسي هو النوع metaclass ، لذلك يتم استدعاء طريقة type’s __call __ ().
<p></span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تستدعي طريقة __call __ () هذه بدورها ما يلي:<br />
__جديد__()<br />
__فيه__()<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا لم يعرّف Foo __new __ () و __init __ () ، يتم توريث الطرق الافتراضية من أصل Foo. ولكن إذا حدد Foo هذه الأساليب ، فإنها تلغي تلك الموجودة في الأصل ، مما يسمح بسلوك مخصص عند إنشاء مثيل Foo.</p>
<p>في ما يلي ، يتم تعريف طريقة مخصصة تسمى new () وتعيينها على أنها طريقة __new __ () لـ Foo:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">new</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="gp">... </span>    <span class="n">x</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="gp">... </span>    <span class="n">x</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">... </span>    <span class="k">return</span> <span class="n">x</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Foo</span><span class="o">.</span><span class="fm">__new__</span> <span class="o">=</span> <span class="n">new</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">g</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">g</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يعدل هذا سلوك إنشاء مثيل للفئة Foo: في كل مرة يتم إنشاء مثيل لـ Foo ، يتم تهيئته افتراضيًا بسمة تسمى attr ، والتي لها قيمة 100. (عادةً ما يظهر رمز مثل هذا في طريقة __init __ () وليس عادةً في __new __ (). تم إنشاء هذا المثال لأغراض توضيحية.)</p>
<p>الآن ، كما تم التأكيد عليه بالفعل ، تعتبر الفئات كائنات أيضًا. لنفترض أنك أردت تخصيص سلوك إنشاء مثيل بشكل مشابه عند إنشاء فئة مثل Foo. إذا كنت ستتبع النمط أعلاه ، فعليك مرة أخرى تحديد طريقة مخصصة وتعيينها على أنها طريقة __new __ () للفئة التي يمثل Foo مثيلًا لها. Foo هو مثيل من النوع metaclass ، لذلك تبدو الشفرة كما يلي:<br />
</span></p>
<pre><code><span class="go"># Spoiler alert:  This doesn't work!</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">new</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="gp">... </span>    <span class="n">x</span> <span class="o">=</span> <span class="nb">type</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="gp">... </span>    <span class="n">x</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">... </span>    <span class="k">return</span> <span class="n">x</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="o">.</span><span class="fm">__new__</span> <span class="o">=</span> <span class="n">new</span>
<span class="gt">Traceback (most recent call last):</span>
  File <span class="nb">"&lt;pyshell#77&gt;"</span>, line <span class="m">1</span>, in <span class="n">&lt;module&gt;</span>
    <span class="nb">type</span><span class="o">.</span><span class="fm">__new__</span> <span class="o">=</span> <span class="n">new</span>
<span class="gr">TypeError</span>: <span class="n">can't set attributes of built-in/extension type 'type'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">باستثناء ، كما ترى ، لا يمكنك إعادة تعيين طريقة __new __ () من النوع metaclass. بايثون لا تسمح بذلك.</p>
<p>ربما هذا فقط كذلك. النوع هو metaclass الذي يتم اشتقاق منه جميع فئات النمط الجديد. لا ينبغي أن تتلاعب بها على أي حال. ولكن بعد ذلك ما هو الملاذ الموجود ، إذا كنت تريد تخصيص مثيل فئة؟</p>
<p>أحد الحلول الممكنة هو metaclass مخصص. بشكل أساسي ، بدلاً من الالتفاف حول النوع metaclass ، يمكنك تحديد metaclass الخاص بك ، والذي يشتق من الكتابة ، ومن ثم يمكنك التخلص منه بدلاً من ذلك.</p>
<p>الخطوة الأولى هي تحديد metaclass المشتق من الكتابة ، على النحو التالي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">dct</span><span class="p">):</span>
<span class="gp">... </span>        <span class="n">x</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">dct</span><span class="p">)</span>
<span class="gp">... </span>        <span class="n">x</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">... </span>        <span class="k">return</span> <span class="n">x</span>
<span class="gp">...</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">فئة رأس التعريف Meta (type): تحدد أن Meta مشتق من النوع. نظرًا لأن الكتابة هي metaclass ، فهذا يجعل Meta metaclass أيضًا.</p>
<p>لاحظ أنه تم تعريف طريقة __new __ () المخصصة للميتا. لم يكن من الممكن القيام بذلك على نوع metaclass مباشرة. تقوم طريقة __new __ () بما يلي:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">المفوضين عبر () super إلى طريقة __new __ () الخاصة بالفئة الوصفية الأصلية (النوع) لإنشاء فصل دراسي جديد بالفعل<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يعيّن سمة السمة المخصصة للفئة بقيمة 100<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إرجاع الفصل الذي تم إنشاؤه حديثًا<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الآن النصف الآخر من الشعوذة: حدد فئة جديدة Foo وحدد أن metaclass الخاص بها هو Metaclass Meta المخصص ، بدلاً من نوع metaclass القياسي. يتم ذلك باستخدام الكلمة الأساسية metaclass في تعريف الفئة على النحو التالي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">Meta</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Foo</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هاهو! اختار Foo سمة Attr تلقائيًا من Meta metaclass. بالطبع ، أي فئات أخرى تحددها بالمثل ستفعل الشيء نفسه:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Bar</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">Meta</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Qux</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">Meta</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Bar</span><span class="o">.</span><span class="n">attr</span><span class="p">,</span> <span class="n">Qux</span><span class="o">.</span><span class="n">attr</span>
<span class="go">(100, 100)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بالطريقة نفسها التي يعمل بها الفصل كقالب لإنشاء الكائنات ، يعمل metaclass كقالب لإنشاء الفئات. يشار إلى Metaclasses أحيانًا بمصانع الطبقة.</p>
<p>قارن بين المثالين التاليين:</p>
<p><strong>مصنع الكائن:</strong><br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span>        <span class="bp">self</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">y</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">y</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">z</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">z</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>مصنع كلاس:</strong><br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
<span class="gp">... </span>        <span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">dct</span>
<span class="gp">... </span>    <span class="p">):</span>
<span class="gp">... </span>        <span class="bp">cls</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">X</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">Meta</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">X</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Y</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">Meta</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Y</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Z</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">Meta</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Z</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span style="font-size: 20pt"><strong>هل هذا حقا ضروري؟</strong></span></p>
<p>بسيط مثل مثال مصنع الفئة أعلاه ، فهو جوهر كيفية عمل metaclasses. أنها تسمح بتخصيص إنشاء مثيل للفئة.</p>
<p>ومع ذلك ، هناك الكثير من الجلبة فقط لمنح سمة السمات المخصصة لكل فئة تم إنشاؤها حديثًا. هل تحتاج حقًا إلى metaclass فقط من أجل ذلك؟</p>
<p>في بايثون ، هناك طريقتان أخريان على الأقل يمكن من خلالها تحقيق الشيء نفسه بشكل فعال:</p>
<p><strong>الميراث البسيط:</strong><br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Base</span><span class="p">:</span>
<span class="gp">... </span>    <span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">X</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Y</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Z</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">X</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Y</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Z</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>مصمم فئة:</strong><br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="gp">... </span>    <span class="k">class</span> <span class="nc">NewClass</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="gp">... </span>        <span class="n">attr</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">... </span>    <span class="k">return</span> <span class="n">NewClass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nd">@decorator</span>
<span class="gp">... </span><span class="k">class</span> <span class="nc">X</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nd">@decorator</span>
<span class="gp">... </span><span class="k">class</span> <span class="nc">Y</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nd">@decorator</span>
<span class="gp">... </span><span class="k">class</span> <span class="nc">Z</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">X</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Y</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Z</span><span class="o">.</span><span class="n">attr</span>
<span class="go">100</span>
</code></pre>
<p><strong><span class="tlid-translation translation" lang="ar" style="font-size: 20pt">خاتمة</span></strong></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span title="">كما يقترح تيم بيترز ، يمكن أن تنحرف الطبقات الوصفية بسهولة إلى عالم كونها &#8220;حل بحثًا عن مشكلة&#8221;.</span> <span title="">ليس من الضروري عادةً إنشاء فئات وصفية مخصصة.</span> <span class="" title="">إذا كان من الممكن حل المشكلة المطروحة بطريقة أبسط ، فمن المحتمل أن تكون كذلك.</span> <span class="" title="">ومع ذلك ، من المفيد فهم الفصول الوصفية بحيث تفهم فئات بايثون بشكل عام ويمكن أن تتعرف على ما إذا كانت metaclass هي الأداة المناسبة للاستخدام.</span></span></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d9%85%d9%8a%d8%aa%d8%a7%d9%83%d9%84%d8%a7%d8%b3-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/">ميتاكلاس بايثون</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>استثناءات بايثون: مقدمة</title>
		<link>https://arabdars.com/%d8%a7%d8%b3%d8%aa%d8%ab%d9%86%d8%a7%d8%a1%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%82%d8%af%d9%85%d8%a9/</link>
		
		<dc:creator><![CDATA[Reyhane]]></dc:creator>
		<pubDate>Mon, 21 Sep 2020 16:10:20 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1628</guid>

					<description><![CDATA[<p>جدول المحتويات الاستثناءات مقابل الأخطاء النحوية رفع استثناء استثناء AssertionError كتلة المحاولة والاستثناء: معالجة الاستثناءات شرط آخر التنظيف بعد الاستخدام أخيرًا تلخيص لما سبق ينتهي برنامج بايثون بمجرد أن يواجه خطأ. في Python ، يمكن أن يكون الخطأ خطأ نحويًا أو استثناءً. في هذه المقالة ، سترى ما هو الاستثناء وكيف يختلف عن الخطأ النحوي. [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%a7%d8%b3%d8%aa%d8%ab%d9%86%d8%a7%d8%a1%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%82%d8%af%d9%85%d8%a9/">استثناءات بايثون: مقدمة</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">جدول المحتويات</span></strong><br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الاستثناءات مقابل الأخطاء النحوية<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">رفع استثناء<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">استثناء AssertionError<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كتلة المحاولة والاستثناء: معالجة الاستثناءات<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">شرط آخر<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">التنظيف بعد الاستخدام أخيرًا<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تلخيص لما سبق<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ينتهي برنامج بايثون بمجرد أن يواجه خطأ. في Python ، يمكن أن يكون الخطأ خطأ نحويًا أو استثناءً. في هذه المقالة ، سترى ما هو الاستثناء وكيف يختلف عن الخطأ النحوي. بعد ذلك ، ستتعرف على كيفية رفع الاستثناءات وتقديم التأكيدات. بعد ذلك ، ستنتهي مع عرض توضيحي لمحاولة الاستثناء.<br />
</span></p>
<p><a href="https://files.realpython.com/media/intro.8915db1758d8.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block " src="https://files.realpython.com/media/intro.8915db1758d8.png" alt="An introduction to exceptions in Python" width="1394" height="411" /></a></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">الاستثناءات مقابل الأخطاء النحوية</span></strong></p>
<p>تحدث أخطاء بناء الجملة عندما يكتشف المحلل اللغوي عبارة غير صحيحة. لاحظ المثال التالي:<br />
</span></p>
<pre><code><span class="x">&gt;&gt;&gt; print( 0 / 0 ))</span>
  File <span class="nb">"&lt;stdin&gt;"</span>, line <span class="m">1</span>
    <span class="nb">print</span><span class="p">(</span> <span class="mi">0</span> <span class="o">/</span> <span class="mi">0</span> <span class="p">))</span>
                  <span class="o">^</span>
<span class="gr">SyntaxError</span>: <span class="n">invalid syntax</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يشير السهم إلى مكان تعرض المحلل اللغوي لخطأ في بناء الجملة. في هذا المثال ، كان هناك قوس واحد أكثر من اللازم. قم بإزالته وتشغيل الكود الخاص بك مرة أخرى:<br />
</span></p>
<pre><code><span class="x">&gt;&gt;&gt; print( 0 / 0)</span>
<span class="gt">Traceback (most recent call last):</span>
  File <span class="nb">"&lt;stdin&gt;"</span>, line <span class="m">1</span>, in <span class="n">&lt;module&gt;</span>
<span class="gr">ZeroDivisionError</span>: <span class="n">integer division or modulo by zero</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هذه المرة ، واجهت خطأ استثناء. يحدث هذا النوع من الأخطاء عندما ينتج عن رمز Python الصحيح من الناحية التركيبية خطأ. أشار السطر الأخير من الرسالة إلى نوع خطأ الاستثناء الذي واجهته.</p>
<p>بدلاً من إظهار خطأ استثناء الرسالة ، توضح Python نوع خطأ الاستثناء الذي تمت مواجهته. في هذه الحالة ، كان خطأ ZeroDivisionError. تأتي Python مع العديد من الاستثناءات المضمنة بالإضافة إلى إمكانية إنشاء استثناءات محددة ذاتيًا.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">رفع استثناء</span></strong></p>
<p>يمكننا استخدام الزيادة لطرح استثناء في حالة حدوث شرط. يمكن استكمال البيان مع استثناء مخصص.<br />
</span></p>
<p><a href="https://files.realpython.com/media/raise.3931e8819e08.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block " src="https://files.realpython.com/media/raise.3931e8819e08.png" alt="Illustration of  raise statement usage" width="1394" height="311" /></a></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا كنت تريد إلقاء خطأ عند حدوث حالة معينة باستخدام الزيادة ، فيمكنك القيام بذلك على النحو التالي:<br />
</span></p>
<pre><code><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">if</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="mi">5</span><span class="p">:</span>
    <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">'x should not exceed 5. The value of x was: </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">عند تشغيل هذا الرمز ، سيكون الإخراج كما يلي:<br />
</span></p>
<pre><code><span class="gt">Traceback (most recent call last):</span>
  File <span class="nb">"&lt;input&gt;"</span>, line <span class="m">4</span>, in <span class="n">&lt;module&gt;</span>
<span class="gr">Exception</span>: <span class="n">x should not exceed 5. The value of x was: 10</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">توقف البرنامج وعرض استثناءنا على الشاشة ، مع تقديم أدلة حول الخطأ الذي حدث.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">استثناء AssertionError</span></strong></p>
<p>بدلاً من انتظار تعطل البرنامج في منتصف الطريق ، يمكنك أيضًا البدء بتأكيد في Python. نؤكد أنه تم استيفاء شرط معين. إذا تبين أن هذا الشرط صحيح ، فهذا ممتاز! يمكن أن يستمر البرنامج. إذا تبين أن الشرط خاطئ ، فيمكنك جعل البرنامج يطرح استثناء AssertionError.<br />
</span></p>
<p><a href="https://files.realpython.com/media/assert.f6d344f0c0b4.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block " src="https://files.realpython.com/media/assert.f6d344f0c0b4.png" alt="Python assert statement" width="1394" height="411" /></a><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ألق نظرة على المثال التالي ، حيث تم التأكيد على أن الكود سيتم تنفيذه على نظام Linux:<br />
</span></p>
<pre><code><span class="kn">import</span> <span class="nn">sys</span>
<span class="k">assert</span> <span class="p">(</span><span class="s1">'linux'</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span><span class="p">),</span> <span class="s2">"This code runs on Linux only."</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا قمت بتشغيل هذا الرمز على جهاز Linux ، فسيتم تمرير التأكيد. إذا كنت ستقوم بتشغيل هذا الرمز على جهاز يعمل بنظام Windows ، فستكون نتيجة التأكيد False وستكون النتيجة كما يلي:<br />
</span></p>
<pre><code><span class="gt">Traceback (most recent call last):</span>
  File <span class="nb">"&lt;input&gt;"</span>, line <span class="m">2</span>, in <span class="n">&lt;module&gt;</span>
<span class="gr">AssertionError</span>: <span class="n">This code runs on Linux only.</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في هذا المثال ، يعد طرح استثناء AssertionError هو آخر شيء سيفعله البرنامج. سيتوقف البرنامج ولن يستمر. ماذا لو لم يكن هذا ما تريده؟</p>
<p><strong><span style="font-size: 20pt">كتلة المحاولة والاستثناء: معالجة الاستثناءات</span></strong></p>
<p>تُستخدم كتلة try and except في Python للقبض على الاستثناءات ومعالجتها. تنفذ Python التعليمات البرمجية التي تلي تعليمة try كجزء &#8220;عادي&#8221; من البرنامج. الكود الذي يتبع تعليمة الاستثناء هو استجابة البرنامج لأي استثناءات في عبارة try السابقة.<br />
</span></p>
<p><a href="https://files.realpython.com/media/try_except.c94eabed2c59.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block " src="https://files.realpython.com/media/try_except.c94eabed2c59.png" alt="Diagram showing try and except statements" width="1394" height="556" /></a><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كما رأيت سابقًا ، عندما تصطدم الشفرة الصحيحة من الناحية التركيبية بخطأ ، فإن Python ستطلق خطأ استثناء. سيؤدي خطأ الاستثناء هذا إلى تعطل البرنامج إذا لم تتم معالجته. يحدد بند الاستثناء كيف يستجيب برنامجك للاستثناءات.</p>
<p>يمكن أن تساعدك الوظيفة التالية في فهم كتلة المحاولة والاستثناء:<br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">linux_interaction</span><span class="p">():</span>
    <span class="k">assert</span> <span class="p">(</span><span class="s1">'linux'</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span><span class="p">),</span> <span class="s2">"Function can only run on Linux systems."</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'Doing something.'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن تشغيل linux_interaction () على نظام Linux فقط. سوف يطرح التأكيد في هذه الوظيفة استثناء AssertionError إذا قمت باستدعائه على نظام تشغيل آخر غير Linux.</p>
<p>يمكنك تجربة الوظيفة باستخدام الكود التالي:<br />
</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="n">linux_interaction</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الطريقة التي تعاملت بها مع الخطأ هنا هي بتسليمك تمريرة. إذا كنت ستقوم بتشغيل هذا الرمز على جهاز يعمل بنظام Windows ، فستحصل على الإخراج التالي:</p>
<p>ليس لديك شيء. الشيء الجيد هنا هو أن البرنامج لم يتعطل. ولكن سيكون من الجيد معرفة ما إذا كان هناك نوع من الاستثناء يحدث عندما قمت بتشغيل الكود الخاص بك. لتحقيق هذه الغاية ، يمكنك تغيير البطاقة إلى شيء من شأنه أن يولد رسالة إعلامية ، مثل:<br />
</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="n">linux_interaction</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'Linux function was not executed'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">قم بتنفيذ هذا الرمز على جهاز يعمل بنظام Windows:<br />
</span></p>
<pre><code><span class="go">Linux function was not executed</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">عند حدوث استثناء في برنامج يقوم بتشغيل هذه الوظيفة ، سيستمر البرنامج بالإضافة إلى إبلاغك بحقيقة أن استدعاء الوظيفة لم يكن ناجحًا.</p>
<p>ما لم تراه هو نوع الخطأ الذي تم إلقاؤه نتيجة لاستدعاء الوظيفة. لكي ترى الخطأ الذي حدث بالضبط ، ستحتاج إلى اكتشاف الخطأ الذي أحدثته الوظيفة.</p>
<p>الكود التالي هو مثال حيث يمكنك التقاط AssertionError وإخراج تلك الرسالة إلى الشاشة:<br />
</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="n">linux_interaction</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'The linux_interaction() function was not executed'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يؤدي تشغيل هذه الوظيفة على جهاز يعمل بنظام Windows إلى ما يلي:<br />
</span></p>
<pre><code><span class="go">Function can only run on Linux systems.</span>
<span class="go">The linux_interaction() function was not executed</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الرسالة الأولى هي AssertionError ، تخبرك أنه لا يمكن تنفيذ الوظيفة إلا على جهاز Linux. تخبرك الرسالة الثانية بالوظيفة التي لم يتم تنفيذها.</p>
<p>في المثال السابق ، قمت باستدعاء دالة كتبتها بنفسك. عند تنفيذ الوظيفة ، اكتشفت استثناء AssertionError وطباعته على الشاشة.</p>
<p>إليك مثال آخر حيث تفتح ملفًا وتستخدم استثناءًا مضمنًا:</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'file.log'</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
        <span class="n">read_data</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'Could not open file.log'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا لم يكن file.log موجودًا ، فستخرج كتلة التعليمات البرمجية هذه ما يلي:<br />
</span></p>
<pre><code><span class="go">Could not open file.log</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هذه رسالة إعلامية ، وسيستمر تشغيل برنامجنا. في مستندات Python ، يمكنك أن ترى أن هناك الكثير من الاستثناءات المضمنة التي يمكنك استخدامها هنا. الاستثناء الوحيد الموضح في تلك الصفحة هو ما يلي:<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">استثناء FileNotFoundError</p>
<p>يُطلق عند طلب ملف أو دليل ولكنه غير موجود. يتوافق مع errno ENOENT.</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">للقبض على هذا النوع من الاستثناءات وطباعته على الشاشة ، يمكنك استخدام الكود التالي:<br />
</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'file.log'</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
        <span class="n">read_data</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span> <span class="k">as</span> <span class="n">fnf_error</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">fnf_error</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في هذه الحالة ، إذا لم يكن file.log موجودًا ، فسيكون الإخراج كما يلي:<br />
</span></p>
<pre><code><span class="go">[Errno 2] No such file or directory: 'file.log'</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن أن يكون لديك أكثر من استدعاء دالة في جملة try وتوقع اصطياد استثناءات مختلفة. الشيء الذي يجب ملاحظته هنا هو أن الكود في جملة try سيتوقف بمجرد مواجهة استثناء.<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تحذير: Catching Exception يخفي كل الأخطاء &#8230; حتى تلك غير المتوقعة تمامًا. هذا هو السبب في أنه يجب عليك تجنب البنود العارية باستثناء البنود في برامج بايثون الخاصة بك. بدلاً من ذلك ، سترغب في الرجوع إلى فئات استثناء محددة تريد التقاطها والتعامل معها. يمكنك معرفة المزيد حول سبب اعتبار هذه فكرة جيدة في هذا البرنامج التعليمي.</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">انظر إلى الكود التالي. هنا ، تقوم أولاً باستدعاء الدالة linux_interaction () ثم تحاول فتح ملف:<br />
</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="n">linux_interaction</span><span class="p">()</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'file.log'</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
        <span class="n">read_data</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span> <span class="k">as</span> <span class="n">fnf_error</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">fnf_error</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'Linux linux_interaction() function was not executed'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا لم يكن الملف موجودًا ، فسيؤدي تشغيل هذا الرمز على جهاز يعمل بنظام Windows إلى إخراج ما يلي:<br />
</span></p>
<pre><code><span class="go">Function can only run on Linux systems.</span>
<span class="go">Linux linux_interaction() function was not executed</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">داخل جملة try ، واجهت استثناء على الفور ولم تصل إلى الجزء الذي تحاول فيه فتح file.log. انظر الآن إلى ما يحدث عند تشغيل الكود على جهاز Linux:<br />
</span></p>
<pre><code><span class="go">[Errno 2] No such file or directory: 'file.log'</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">فيما يلي النقاط الرئيسية:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يتم تنفيذ جملة محاولة حتى النقطة التي يتم فيها مواجهة الاستثناء الأول.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">داخل بند الاستثناء ، أو معالج الاستثناء ، يمكنك تحديد كيفية استجابة البرنامج للاستثناء.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكنك توقع استثناءات متعددة والتمييز بين كيفية استجابة البرنامج لها.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تجنب استخدام العارية باستثناء الجمل.<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">شرط آخر</span></strong></p>
<p>في Python ، باستخدام تعليمة else ، يمكنك توجيه برنامج لتنفيذ كتلة معينة من التعليمات البرمجية فقط في حالة عدم وجود استثناءات.<br />
</span></p>
<p><a href="https://files.realpython.com/media/try_except_else.703aaeeb63d3.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block " src="https://files.realpython.com/media/try_except_else.703aaeeb63d3.png" alt="Diagram of try, except, and else statements in Python" width="1394" height="783" /></a><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ننظر إلى المثال التالي:<br />
</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="n">linux_interaction</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'Executing the else clause.'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا كنت ستقوم بتشغيل هذا الرمز على نظام Linux ، فسيكون الإخراج كما يلي:<br />
</span></p>
<pre><code><span class="go">Doing something.</span>
<span class="go">Executing the else clause.</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">نظرًا لأن البرنامج لم يتم تشغيله في أي استثناءات ، تم تنفيذ جملة else.</p>
<p>يمكنك أيضًا محاولة تشغيل التعليمات البرمجية داخل جملة else والتقاط الاستثناءات المحتملة هناك أيضًا:<br />
</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="n">linux_interaction</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'file.log'</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
            <span class="n">read_data</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
    <span class="k">except</span> <span class="ne">FileNotFoundError</span> <span class="k">as</span> <span class="n">fnf_error</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="n">fnf_error</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا كنت ستقوم بتنفيذ هذا الرمز على جهاز Linux ، فستحصل على النتيجة التالية:<br />
</span></p>
<pre><code><span class="go">Doing something.</span>
<span class="go">[Errno 2] No such file or directory: 'file.log'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">من الإخراج ، يمكنك أن ترى أن وظيفة linux_interaction () تعمل. بسبب عدم وجود استثناءات ، تم إجراء محاولة لفتح file.log. هذا الملف غير موجود ، وبدلاً من فتح الملف ، اكتشفت استثناء FileNotFoundError.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">التنظيف بعد الاستخدام أخيرًا</span></strong></p>
<p>تخيل أنه كان عليك دائمًا تنفيذ نوع من الإجراءات للتنظيف بعد تنفيذ التعليمات البرمجية الخاصة بك. تمكنك لغة بايثون من القيام بذلك باستخدام الجملة النهائية.<br />
</span></p>
<p><a href="https://files.realpython.com/media/try_except_else_finally.a7fac6c36c55.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block " src="https://files.realpython.com/media/try_except_else_finally.a7fac6c36c55.png" alt="Diagram explaining try except else finally statements" width="1394" height="1000" /></a></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ألق نظرة على المثال التالي:<br />
</span></p>
<pre><code><span class="k">try</span><span class="p">:</span>
    <span class="n">linux_interaction</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'file.log'</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
            <span class="n">read_data</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
    <span class="k">except</span> <span class="ne">FileNotFoundError</span> <span class="k">as</span> <span class="n">fnf_error</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="n">fnf_error</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'Cleaning up, irrespective of any exceptions.'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في الكود السابق ، سيتم تنفيذ كل شيء في الجملة النهائية. لا يهم إذا واجهت استثناء في مكان ما في جمل try أو else. سيؤدي تشغيل الكود السابق على جهاز يعمل بنظام Windows إلى إخراج ما يلي:<br />
</span></p>
<pre><code><span class="go">Function can only run on Linux systems.</span>
<span class="go">Cleaning up, irrespective of any exceptions.</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">تلخيص لما سبق</span></strong></p>
<p>بعد رؤية الفرق بين أخطاء بناء الجملة والاستثناءات ، تعلمت طرقًا مختلفة لرفع الاستثناءات والتقاطها والتعامل معها في Python. في هذه المقالة ، رأيت الخيارات التالية:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يسمح لك رفع استثناء في أي وقت.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكنك التأكيد من التحقق مما إذا تم استيفاء شرط معين ورمي استثناء إذا لم يكن كذلك.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في جملة try ، يتم تنفيذ جميع العبارات حتى يتم مواجهة استثناء.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يتم استخدام ما عدا لالتقاط ومعالجة الاستثناء (الاستثناءات) التي تمت مواجهتها في عبارة try.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يتيح لك else أقسام التعليمات البرمجية التي يجب تشغيلها فقط عند عدم وجود استثناءات في جملة try.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يتيح لك أخيرًا تنفيذ أقسام التعليمات البرمجية التي يجب تشغيلها دائمًا ، مع أو بدون أي استثناءات تمت مواجهتها مسبقًا.<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">نأمل أن تساعدك هذه المقالة في فهم الأدوات الأساسية التي يجب أن تقدمها Python عند التعامل مع الاستثناءات.</span></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%a7%d8%b3%d8%aa%d8%ab%d9%86%d8%a7%d8%a1%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%82%d8%af%d9%85%d8%a9/">استثناءات بايثون: مقدمة</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>وحدة مسار بايثون 3: ترويض نظام الملفات</title>
		<link>https://arabdars.com/%d9%88%d8%ad%d8%af%d8%a9-%d9%85%d8%b3%d8%a7%d8%b1-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-3-%d8%aa%d8%b1%d9%88%d9%8a%d8%b6-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d9%85%d9%84%d9%81%d8%a7%d8%aa/</link>
		
		<dc:creator><![CDATA[Reyhane]]></dc:creator>
		<pubDate>Mon, 21 Sep 2020 15:28:53 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1626</guid>

					<description><![CDATA[<p>جدول المحتويات مشكلة معالجة مسار ملف بايثون خلق المسارات قراءة وكتابة الملفات انتقاء مكونات المسار نقل وحذف الملفات أمثلة عد الملفات عرض شجرة الدليل ابحث عن آخر ملف تم تعديله قم بإنشاء اسم ملف فريد اختلافات نظام التشغيل المسارات ككائنات مناسبة خاتمة هل واجهت صعوبة في التعامل مع مسار الملف في بايثون؟ في Python 3.4 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d9%88%d8%ad%d8%af%d8%a9-%d9%85%d8%b3%d8%a7%d8%b1-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-3-%d8%aa%d8%b1%d9%88%d9%8a%d8%b6-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d9%85%d9%84%d9%81%d8%a7%d8%aa/">وحدة مسار بايثون 3: ترويض نظام الملفات</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">جدول المحتويات</span></strong><br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">مشكلة معالجة مسار ملف بايثون<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">خلق المسارات<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">قراءة وكتابة الملفات<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">انتقاء مكونات المسار<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">نقل وحذف الملفات<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">أمثلة<br />
عد الملفات<br />
عرض شجرة الدليل<br />
ابحث عن آخر ملف تم تعديله<br />
قم بإنشاء اسم ملف فريد<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">اختلافات نظام التشغيل<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">المسارات ككائنات مناسبة<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">خاتمة<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هل واجهت صعوبة في التعامل مع مسار الملف في بايثون؟ في Python 3.4 وما فوق ، انتهى الصراع الآن! لم تعد بحاجة إلى خدش رأسك فوق التعليمات البرمجية مثل:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s1">'</span><span class="se">\\</span><span class="s1">'</span><span class="p">,</span> <span class="n">maxsplit</span><span class="o">=</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">أو الاستياء من الإسهاب في:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s1">'~'</span><span class="p">),</span> <span class="s1">'realpython.txt'</span><span class="p">))</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في هذا البرنامج التعليمي ، سوف ترى كيفية التعامل مع مسارات الملفات &#8211; أسماء الأدلة والملفات &#8211; في Python. ستتعلم طرقًا جديدة لقراءة الملفات وكتابتها ، ومعالجة المسارات ونظام الملفات الأساسي ، بالإضافة إلى الاطلاع على بعض الأمثلة حول كيفية سرد الملفات وتكرارها. باستخدام وحدة pathlib ، يمكن إعادة كتابة المثالين أعلاه باستخدام رمز Pythonic أنيق وقابل للقراءة مثل:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">parent</span>
<span class="gp">&gt;&gt;&gt; </span><span class="p">(</span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">home</span><span class="p">()</span> <span class="o">/</span> <span class="s1">'realpython.txt'</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">()</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">مشكلة معالجة مسار ملف بايثون</span></strong></p>
<p>يعد العمل مع الملفات والتفاعل مع نظام الملفات أمرًا مهمًا لأسباب عديدة مختلفة. قد تتضمن أبسط الحالات قراءة الملفات أو كتابتها فقط ، ولكن في بعض الأحيان تكون المهام الأكثر تعقيدًا في متناول اليد. ربما تحتاج إلى سرد جميع الملفات في دليل من نوع معين ، أو العثور على الدليل الأصل لملف معين ، أو إنشاء اسم ملف فريد غير موجود بالفعل.</p>
<p>تقليديًا ، تمثل Python مسارات الملفات باستخدام سلاسل نصية عادية. بدعم من مكتبة os.path القياسية ، كان هذا مناسبًا على الرغم من كونه مرهقًا بعض الشيء (كما يوضح المثال الثاني في المقدمة). ومع ذلك ، نظرًا لأن المسارات ليست سلاسل ، تنتشر الوظائف المهمة في جميع أنحاء المكتبة القياسية ، بما في ذلك المكتبات مثل os و glob و shutil. يحتاج المثال التالي إلى ثلاث عبارات استيراد فقط لنقل جميع الملفات النصية إلى دليل أرشيف:<br />
</span></p>
<pre><code><span class="kn">import</span> <span class="nn">glob</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">shutil</span>

<span class="k">for</span> <span class="n">file_name</span> <span class="ow">in</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'*.txt'</span><span class="p">):</span>
    <span class="n">new_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">'archive'</span><span class="p">,</span> <span class="n">file_name</span><span class="p">)</span>
    <span class="n">shutil</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">new_path</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">مع المسارات التي يتم تمثيلها بواسطة سلاسل ، من الممكن ، ولكن عادة ما تكون فكرة سيئة ، استخدام طرق سلسلة منتظمة. على سبيل المثال ، بدلاً من ضم مسارين مع + مثل السلاسل العادية ، يجب عليك استخدام os.path.join () ، الذي يربط المسارات باستخدام فاصل المسار الصحيح في نظام التشغيل. تذكر أن Windows يستخدم \ بينما يستخدم Mac و Linux / كفاصل. يمكن أن يؤدي هذا الاختلاف إلى أخطاء يصعب تحديدها ، مثل مثالنا الأول في المقدمة الذي يعمل مع مسارات Windows فقط.</p>
<p>تم تقديم وحدة pathlib في Python 3.4 (PEP 428) للتعامل مع هذه التحديات. إنه يجمع الوظائف الضرورية في مكان واحد ويجعلها متاحة من خلال الأساليب والخصائص على كائن مسار سهل الاستخدام.</p>
<p>في وقت مبكر ، لا تزال الحزم الأخرى تستخدم سلاسل لمسارات الملفات ، ولكن اعتبارًا من Python 3.6 ، يتم دعم وحدة pathlib في جميع أنحاء المكتبة القياسية ، ويرجع ذلك جزئيًا إلى إضافة بروتوكول مسار نظام الملفات. إذا كنت عالقًا في Python القديمة ، فهناك أيضًا منفذ خلفي متاح لـ Python 2.</p>
<p>حان وقت العمل: دعونا نرى كيف يعمل pathlib عمليًا.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">خلق المسارات</span></strong></p>
<p>كل ما تحتاج إلى معرفته حقًا هو فئة pathlib.Path. هناك عدة طرق مختلفة لإنشاء المسار. أولاً وقبل كل شيء ، هناك طرق فصل مثل .cwd () (دليل العمل الحالي) و .home () (الدليل الرئيسي للمستخدم):<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">pathlib</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>
<span class="go">PosixPath('/home/gahjelle/realpython/')</span>
</code></pre>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ملاحظة: خلال هذا البرنامج التعليمي ، سنفترض أن pathlib قد تم استيراده ، دون توضيح استيراد pathlib على النحو الوارد أعلاه. نظرًا لأنك ستستخدم فئة المسار بشكل أساسي ، يمكنك أيضًا القيام بذلك من pathlib import Path وكتابة Path بدلاً من pathlib.Path.<br />
</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن أيضًا إنشاء المسار بشكل صريح من تمثيل السلسلة الخاص به:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="sa">r</span><span class="s1">'C:\Users\gahjelle\realpython\file.txt'</span><span class="p">)</span>
<span class="go">WindowsPath('C:/Users/gahjelle/realpython/file.txt')</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">نصيحة صغيرة للتعامل مع مسارات Windows: في Windows ، يكون فاصل المسار عبارة عن شرطة مائلة للخلف ، \. ومع ذلك ، في العديد من السياقات ، تُستخدم الشرطة المائلة العكسية أيضًا كحرف هروب من أجل تمثيل الأحرف غير القابلة للطباعة. لتجنب المشاكل ، استخدم القيم الحرفية للسلسلة الأولية لتمثيل مسارات Windows. هذه عبارة عن سلسلة حرفية لها حرف r مُسبق لها. في سلسلة الأحرف الأولية ، يمثل \ خط مائل عكسي حرفي: r&#8217;C: \ Users &#8216;.</p>
<p>الطريقة الثالثة لبناء مسار هي الانضمام إلى أجزاء المسار باستخدام عامل التشغيل الخاص /. يتم استخدام عامل تشغيل الشرطة المائلة للأمام بشكل مستقل عن فاصل المسار الفعلي على المنصة:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">home</span><span class="p">()</span> <span class="o">/</span> <span class="s1">'python'</span> <span class="o">/</span> <span class="s1">'scripts'</span> <span class="o">/</span> <span class="s1">'test.py'</span>
<span class="go">PosixPath('/home/gahjelle/python/scripts/test.py')</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن أن يصل / إلى عدة مسارات أو مزيج من المسارات والسلاسل (على النحو الوارد أعلاه) طالما أن هناك كائن مسار واحد على الأقل. إذا لم تعجبك الخاص / الترميز ، يمكنك فعل الشيء نفسه باستخدام طريقة .joinpath ():<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">home</span><span class="p">()</span><span class="o">.</span><span class="n">joinpath</span><span class="p">(</span><span class="s1">'python'</span><span class="p">,</span> <span class="s1">'scripts'</span><span class="p">,</span> <span class="s1">'test.py'</span><span class="p">)</span>
<span class="go">PosixPath('/home/gahjelle/python/scripts/test.py')</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ أنه في الأمثلة السابقة ، يتم تمثيل pathlib.Path إما بواسطة WindowsPath أو PosixPath. يعتمد الكائن الفعلي الذي يمثل المسار على نظام التشغيل الأساسي. (بمعنى ، تم تشغيل مثال WindowsPath على نظام التشغيل Windows ، بينما تم تشغيل أمثلة PosixPath على نظام التشغيل Mac أو Linux.) راجع قسم &#8220;اختلافات نظام التشغيل&#8221; لمزيد من المعلومات.</p>
<p><strong><span style="font-size: 20pt">قراءة وكتابة الملفات</span></strong></span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تقليديًا ، كانت طريقة قراءة أو كتابة ملف في Python هي استخدام وظيفة open () المضمنة. لا يزال هذا صحيحًا لأن الوظيفة open () يمكنها استخدام كائنات المسار مباشرةً. يعثر المثال التالي على جميع الرؤوس في ملف Markdown ويطبعها:<br />
</span></p>
<pre><code><span class="n">path</span> <span class="o">=</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="s1">'test.md'</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fid</span><span class="p">:</span>
    <span class="n">headers</span> <span class="o">=</span> <span class="p">[</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">fid</span> <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'#'</span><span class="p">)]</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">headers</span><span class="p">))</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بديل مكافئ هو استدعاء .open () على كائن المسار:<br />
</span></p>
<pre><code><span class="k">with</span> <span class="n">path</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fid</span><span class="p">:</span>
    <span class="o">...</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في الواقع ، يقوم Path.open () باستدعاء العنصر الداخلي open () خلف الكواليس. الخيار الذي تستخدمه هو في الأساس مسألة ذوق.</p>
<p>لقراءة الملفات وكتابتها بشكل بسيط ، هناك طريقتان ملائمتان في مكتبة pathlib:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.</span><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">read_text (): افتح المسار في وضع النص وأعد المحتويات كسلسلة.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.read_bytes (): افتح المسار في الوضع الثنائي / البايت وأعد المحتويات كاختبار بايت.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.write_text (): افتح المسار واكتب بيانات السلسلة إليه.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.write_bytes (): افتح المسار في الوضع الثنائي / بايت واكتب البيانات إليه.<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كل من هذه الطرق تتعامل مع فتح وإغلاق الملف ، مما يجعلها سهلة الاستخدام ، على سبيل المثال:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">path</span> <span class="o">=</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="s1">'test.md'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">read_text</span><span class="p">()</span>
<span class="go">&lt;the contents of the test.md-file&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن أيضًا تحديد المسارات كأسماء ملفات بسيطة ، وفي هذه الحالة يتم تفسيرها بالنسبة إلى دليل العمل الحالي. المثال التالي يعادل المثال السابق:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="s1">'test.md'</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">()</span>
<span class="go">&lt;the contents of the test.md-file&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">سيجد الأسلوب .resolve () المسار الكامل. أدناه ، نؤكد أن دليل العمل الحالي يُستخدم لأسماء الملفات البسيطة:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">path</span> <span class="o">=</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="s1">'test.md'</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">resolve</span><span class="p">()</span>
<span class="go">PosixPath('/home/gahjelle/realpython/test.md')</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">resolve</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span> <span class="o">==</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>
<span class="go">True</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">parent</span> <span class="o">==</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>
<span class="go">False</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ أنه عند مقارنة المسارات ، يتم مقارنة تمثيلاتها. في المثال أعلاه ، path.parent لا يساوي pathlib.Path.cwd () ، لأن path.parent يتم تمثيله بواسطة &#8220;.&#8221; بينما يتم تمثيل pathlib.Path.cwd () بـ &#8220;/ home / gahjelle / realpython /&#8221;.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">انتقاء مكونات المسار</span></strong></p>
<p>الأجزاء المختلفة من المسار متوفرة بسهولة كخصائص. تشمل الأمثلة الأساسية ما يلي:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.name: اسم الملف بدون أي دليل<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.parent: الدليل الذي يحتوي على الملف ، أو الدليل الأصل إذا كان المسار عبارة عن دليل<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.stem: اسم الملف بدون اللاحقة<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.suffix: امتداد الملف<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.anchor: جزء المسار قبل الدلائل<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">فيما يلي هذه الخصائص قيد التشغيل:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">path</span>
<span class="go">PosixPath('/home/gahjelle/realpython/test.md')</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">name</span>
<span class="go">'test.md'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">stem</span>
<span class="go">'test'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">suffix</span>
<span class="go">'.md'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">parent</span>
<span class="go">PosixPath('/home/gahjelle/realpython')</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">parent</span>
<span class="go">PosixPath('/home/gahjelle')</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">anchor</span>
<span class="go">'/'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ أن .parent ترجع كائن مسار جديد ، بينما تقوم الخصائص الأخرى بإرجاع سلاسل. هذا يعني على سبيل المثال أنه يمكن ربط .parent كما في المثال الأخير أو حتى دمجها مع / لإنشاء مسارات جديدة تمامًا:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="p">(</span><span class="s1">'new'</span> <span class="o">+</span> <span class="n">path</span><span class="o">.</span><span class="n">suffix</span><span class="p">)</span>
<span class="go">PosixPath('/home/gahjelle/new.md')</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">توفر ورقة غش Pathlib الممتازة تمثيلًا مرئيًا لهذه الخصائص والطرق وغيرها.</p>
<p><strong><span style="font-size: 20pt">نقل وحذف الملفات</span></strong></p>
<p>من خلال pathlib ، يمكنك أيضًا الوصول إلى عمليات مستوى نظام الملفات الأساسية مثل نقل الملفات وتحديثها وحتى حذفها. بالنسبة للجزء الأكبر ، لا تعطي هذه الطرق تحذيرًا أو تنتظر التأكيد قبل فقد المعلومات أو الملفات. كن حذرا عند استخدام هذه الأساليب.</p>
<p>لنقل ملف ، استخدم .replace (). لاحظ أنه إذا كانت الوجهة موجودة بالفعل ، فسيحل محلها .replace (). لسوء الحظ ، لا يدعم pathlib صراحة النقل الآمن للملفات. لتجنب احتمال الكتابة فوق مسار الوجهة ، فإن أبسط شيء هو اختبار ما إذا كانت الوجهة موجودة قبل استبدال:<br />
</span></p>
<pre><code><span class="k">if</span> <span class="ow">not</span> <span class="n">destination</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
    <span class="n">source</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">destination</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ومع ذلك ، فإن هذا يترك الباب مفتوحًا لظروف السباق المحتملة. قد تضيف عملية أخرى ملفًا في مسار الوجهة بين تنفيذ تعليمة if وطريقة .replace (). إذا كان هذا مصدر قلق ، فإن الطريقة الأكثر أمانًا هي فتح مسار الوجهة لإنشاء حصري ونسخ بيانات المصدر بشكل صريح:<br />
</span></p>
<pre><code><span class="k">with</span> <span class="n">destination</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s1">'xb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fid</span><span class="p">:</span>
    <span class="n">fid</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">read_bytes</span><span class="p">())</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">سيؤدي الكود أعلاه إلى رفع FileExistsError إذا كانت الوجهة موجودة بالفعل. من الناحية الفنية ، هذا ينسخ ملفًا. لإجراء نقل ، ما عليك سوى حذف المصدر بعد الانتهاء من النسخ (انظر أدناه). تأكد من عدم وجود استثناء على الرغم من.</p>
<p>عندما تعيد تسمية الملفات ، قد تكون الطرق المفيدة .with_name () و .with_suffix (). كلاهما يعيد المسار الأصلي ولكن مع استبدال الاسم أو اللاحقة ، على التوالي.</p>
<p>على سبيل المثال:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">path</span>
<span class="go">PosixPath('/home/gahjelle/realpython/test001.txt')</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">with_suffix</span><span class="p">(</span><span class="s1">'.py'</span><span class="p">)</span>
<span class="go">PosixPath('/home/gahjelle/realpython/test001.py')</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">with_suffix</span><span class="p">(</span><span class="s1">'.py'</span><span class="p">))</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن حذف الدلائل والملفات باستخدام .rmdir () و .unlink () على التوالي. (مرة أخرى ، كن حذرا!)<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">أمثلة</span></strong></p>
<p>في هذا القسم ، سترى بعض الأمثلة على كيفية استخدام pathlib للتعامل مع التحديات البسيطة.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>عد الملفات</strong></p>
<p>هناك عدة طرق مختلفة لسرد العديد من الملفات. أبسطها هي طريقة .iterdir () ، والتي تتكرر عبر جميع الملفات في الدليل المحدد. يجمع المثال التالي بين .iterdir () والمجموعات. فئة Counter لحساب عدد الملفات الموجودة لكل نوع ملف في الدليل الحالي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">collections</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">collections</span><span class="o">.</span><span class="n">Counter</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">suffix</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span><span class="o">.</span><span class="n">iterdir</span><span class="p">())</span>
<span class="go">Counter({'.md': 2, '.txt': 4, '.pdf': 2, '.py': 1})</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن إنشاء قوائم ملفات أكثر مرونة باستخدام الأساليب .glob () و .rglob () (الكرة العودية العودية). على سبيل المثال ، يقوم pathlib.Path.cwd (). glob (&#8216;*. txt&#8217;) بإرجاع جميع الملفات التي تحتوي على لاحقة .txt في الدليل الحالي. فيما يلي فقط أنواع الملفات التي تبدأ بـ p:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">collections</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">collections</span><span class="o">.</span><span class="n">Counter</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">suffix</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'*.p*'</span><span class="p">))</span>
<span class="go">Counter({'.pdf': 2, '.py': 1})</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>عرض شجرة الدليل</strong></p>
<p>يحدد المثال التالي دالة ، الشجرة () ، والتي ستطبع شجرة مرئية تمثل التسلسل الهرمي للملف ، متجذرة في دليل معين. هنا ، نريد سرد الأدلة الفرعية أيضًا ، لذلك نستخدم طريقة .rglob ():</span></p>
<pre><code><span class="k">def</span> <span class="nf">tree</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'+ </span><span class="si">{</span><span class="n">directory</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">directory</span><span class="o">.</span><span class="n">rglob</span><span class="p">(</span><span class="s1">'*'</span><span class="p">)):</span>
        <span class="n">depth</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">relative_to</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span><span class="o">.</span><span class="n">parts</span><span class="p">)</span>
        <span class="n">spacer</span> <span class="o">=</span> <span class="s1">'    '</span> <span class="o">*</span> <span class="n">depth</span>
        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">spacer</span><span class="si">}</span><span class="s1">+ </span><span class="si">{</span><span class="n">path</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ أننا نحتاج إلى معرفة المسافة البُعدية التي يقع فيها الملف عن الدليل الجذر. للقيام بذلك ، نستخدم أولاً .relative_to () لتمثيل مسار متعلق بالدليل الجذر. بعد ذلك ، نحسب عدد الأدلة (باستخدام خاصية .parts) في التمثيل. عند التشغيل ، تنشئ هذه الوظيفة شجرة مرئية مثل ما يلي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">tree</span><span class="p">(</span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">())</span>
<span class="go">+ /home/gahjelle/realpython</span>
<span class="go">    + directory_1</span>
<span class="go">        + file_a.md</span>
<span class="go">    + directory_2</span>
<span class="go">        + file_a.md</span>
<span class="go">        + file_b.pdf</span>
<span class="go">        + file_c.py</span>
<span class="go">    + file_1.txt</span>
<span class="go">    + file_2.txt</span>
</code></pre>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ملاحظة: لا تعمل سلاسل f إلا في Python 3.6 والإصدارات الأحدث. في لغة Pythons الأقدم ، يمكن كتابة التعبير f &#8216;{spacer} + {path.name}&#8217; {0} + {1} &#8216;. (spacer، path.name).<br />
</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>ابحث عن آخر ملف تم تعديله</strong></p>
<p>تعتبر طرق .iterdir () و .glob () و .rglob () مناسبة جدًا لتعبيرات المولد وفهم القوائم. للعثور على الملف في دليل تم تعديله مؤخرًا ، يمكنك استخدام طريقة .stat () للحصول على معلومات حول الملفات الأساسية. على سبيل المثال ، يعطي .stat (). st_mtime وقت آخر تعديل لملف:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">time</span><span class="p">,</span> <span class="n">file_path</span> <span class="o">=</span> <span class="nb">max</span><span class="p">((</span><span class="n">f</span><span class="o">.</span><span class="n">stat</span><span class="p">()</span><span class="o">.</span><span class="n">st_mtime</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">directory</span><span class="o">.</span><span class="n">iterdir</span><span class="p">())</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time</span><span class="p">),</span> <span class="n">file_path</span><span class="p">)</span>
<span class="go">2018-03-23 19:23:56.977817 /home/gahjelle/realpython/test001.txt</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكنك حتى الحصول على محتويات الملف الذي تم تعديله آخر مرة بتعبير مشابه:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">max</span><span class="p">((</span><span class="n">f</span><span class="o">.</span><span class="n">stat</span><span class="p">()</span><span class="o">.</span><span class="n">st_mtime</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">directory</span><span class="o">.</span><span class="n">iterdir</span><span class="p">())[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">read_text</span><span class="p">()</span>
<span class="go">&lt;the contents of the last modified file in directory&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمثل الطابع الزمني الذي تم إرجاعه من خصائص .stat (). st_ المختلفة الثواني منذ الأول من يناير 1970. بالإضافة إلى datetime.fromtimestamp ، يمكن استخدام time.localtime أو time.ctime لتحويل الطابع الزمني إلى شيء أكثر قابلية للاستخدام.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>قم بإنشاء اسم ملف فريد</strong></p>
<p>سيوضح المثال الأخير كيفية إنشاء اسم ملف مرقم فريد بناءً على قالب. أولاً ، حدد نمطًا لاسم الملف ، مع مساحة للعداد. بعد ذلك ، تحقق من وجود مسار الملف الذي تم إنشاؤه من خلال الانضمام إلى دليل واسم الملف (مع قيمة للعداد). إذا كان موجودًا بالفعل ، فقم بزيادة العداد وحاول مرة أخرى:<br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">unique_path</span><span class="p">(</span><span class="n">directory</span><span class="p">,</span> <span class="n">name_pattern</span><span class="p">):</span>
    <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
        <span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="n">path</span> <span class="o">=</span> <span class="n">directory</span> <span class="o">/</span> <span class="n">name_pattern</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">counter</span><span class="p">)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
            <span class="k">return</span> <span class="n">path</span>

<span class="n">path</span> <span class="o">=</span> <span class="n">unique_path</span><span class="p">(</span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">(),</span> <span class="s1">'test</span><span class="si">{:03d}</span><span class="s1">.txt'</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا كان الدليل يحتوي بالفعل على الملفين test001.txt و test002.txt ، فسيقوم الرمز أعلاه بتعيين المسار إلى test003.txt.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">اختلافات نظام التشغيل</span></strong></p>
<p>لاحظنا سابقًا أنه عندما قمنا بإنشاء مثيل لـ pathlib.Path ، تم إرجاع كائن WindowsPath أو PosixPath. يعتمد نوع الكائن على نظام التشغيل الذي تستخدمه. هذه الميزة تجعل من السهل إلى حد ما كتابة رمز متوافق عبر الأنظمة الأساسية. من الممكن أن تطلب WindowsPath أو PosixPath صراحة ، لكنك ستقتصر رمزك على هذا النظام فقط دون أي فوائد. لا يمكن استخدام مسار ملموس مثل هذا في نظام مختلف:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">pathlib</span><span class="o">.</span><span class="n">WindowsPath</span><span class="p">(</span><span class="s1">'test.md'</span><span class="p">)</span>
<span class="go">NotImplementedError: cannot instantiate 'WindowsPath' on your system</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">قد تكون هناك أوقات تحتاج فيها إلى تمثيل المسار دون الوصول إلى نظام الملفات الأساسي (في هذه الحالة قد يكون من المنطقي أيضًا تمثيل مسار Windows على نظام بخلاف Windows أو العكس). يمكن القيام بذلك باستخدام كائنات PurePath. تدعم هذه الكائنات العمليات التي تمت مناقشتها في القسم الخاص بمكونات المسار ولكن ليس الطرق التي تصل إلى نظام الملفات:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">path</span> <span class="o">=</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">PureWindowsPath</span><span class="p">(</span><span class="sa">r</span><span class="s1">'C:\Users\gahjelle\realpython\file.txt'</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">name</span>
<span class="go">'file.txt'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">parent</span>
<span class="go">PureWindowsPath('C:/Users/gahjelle/realpython')</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span>
<span class="go">AttributeError: 'PureWindowsPath' object has no attribute 'exists'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكنك إنشاء مثيل PureWindowsPath أو PurePosixPath مباشرة على جميع الأنظمة. سيؤدي Instantiating PurePath إلى إرجاع أحد هذه الكائنات اعتمادًا على نظام التشغيل الذي تستخدمه.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">المسارات ككائنات مناسبة</span></strong></p>
<p>في المقدمة ، لاحظنا بإيجاز أن المسارات ليست سلاسل ، والدافع وراء pathlib هو تمثيل نظام الملفات بالكائنات المناسبة. في الواقع ، التوثيق الرسمي لـ pathlib هو pathlib &#8211; مسارات نظام الملفات الموجهة للكائنات. إن النهج الموجه للكائنات مرئي بالفعل في الأمثلة أعلاه (خاصة إذا كنت تتناقض مع طريقة os.path القديمة للقيام بالأشياء). ومع ذلك ، دعني أترك لك بعض الحكايات الأخرى.</p>
<p>بصرف النظر عن نظام التشغيل الذي تستخدمه ، يتم تمثيل المسارات بأسلوب Posix ، مع استخدام الشرطة المائلة للأمام كفاصل للمسار. في Windows ، سترى شيئًا كهذا:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="sa">r</span><span class="s1">'C:\Users\gahjelle\realpython\file.txt'</span><span class="p">)</span>
<span class="go">WindowsPath('C:/Users/gahjelle/realpython/file.txt')</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ومع ذلك ، عندما يتم تحويل مسار إلى سلسلة ، فإنه سيستخدم النموذج الأصلي ، على سبيل المثال مع خطوط مائلة عكسية على Windows:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">str</span><span class="p">(</span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="sa">r</span><span class="s1">'C:\Users\gahjelle\realpython\file.txt'</span><span class="p">))</span>
<span class="go">'C:\\Users\\gahjelle\\realpython\\file.txt'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هذا مفيد بشكل خاص إذا كنت تستخدم مكتبة لا تعرف كيفية التعامل مع كائنات pathlib.Path. هذه مشكلة أكبر في إصدارات Python قبل 3.6. على سبيل المثال ، في Python 3.5 ، يمكن لمكتبة configparser القياسية استخدام مسارات سلسلة فقط لقراءة الملفات. طريقة معالجة مثل هذه الحالات هي القيام بالتحويل إلى سلسلة بشكل صريح:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">configparser</span> <span class="kn">import</span> <span class="n">ConfigParser</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">path</span> <span class="o">=</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="s1">'config.txt'</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">cfg</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">cfg</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>                     <span class="c1"># Error on Python &lt; 3.6</span>
<span class="go">TypeError: 'PosixPath' object is not iterable</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">cfg</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>                <span class="c1"># Works on Python &gt;= 3.4</span>
<span class="go">['config.txt']</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في Python 3.6 والإصدارات الأحدث ، يوصى باستخدام os.fspath () بدلاً من str () إذا كنت بحاجة إلى إجراء تحويل صريح. يعد هذا أكثر أمانًا لأنه سيؤدي إلى حدوث خطأ إذا حاولت عن طريق الخطأ تحويل كائن لا يشبه المسار.</p>
<p>من المحتمل أن يكون الجزء الأكثر غرابة من مكتبة pathlib هو استخدام العامل /. لإلقاء نظرة خاطفة على الغطاء ، دعونا نرى كيف يتم تنفيذ ذلك. هذا مثال على التحميل الزائد للمشغل: يتغير سلوك المشغل حسب السياق. لقد رأيت هذا من قبل. فكر في كيف + تعني أشياء مختلفة للسلاسل والأرقام. تنفذ Python التحميل الزائد للمشغل من خلال استخدام أساليب الشرطة السفلية المزدوجة (المعروفة أيضًا بأساليب dunder).</p>
<p>يتم تحديد عامل التشغيل / بواسطة طريقة .__ truediv __ (). في الواقع ، إذا ألقيت نظرة على الكود المصدري لـ pathlib ، فسترى شيئًا مثل:<br />
</span></p>
<pre><code><span class="k">class</span> <span class="nc">PurePath</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>

    <span class="k">def</span> <span class="fm">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_child</span><span class="p">((</span><span class="n">key</span><span class="p">,))</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">خاتمة</span></strong></p>
<p>منذ Python 3.4 ، أصبح pathlib متاحًا في المكتبة القياسية. باستخدام pathlib ، يمكن تمثيل مسارات الملفات بواسطة كائنات المسار المناسبة بدلاً من السلاسل العادية كما في السابق. هذه الكائنات تجعل التعليمات البرمجية تتعامل مع مسارات الملفات:</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span title="">أسهل للقراءة ، خاصةً لأنه / يُستخدم لربط المسارات معًا</span><br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span title="">أكثر قوة ، مع توفر معظم الأساليب والخصائص الضرورية مباشرة على الكائن</span><br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span title="">أكثر اتساقًا عبر أنظمة التشغيل ، حيث يتم إخفاء خصائص الأنظمة المختلفة بواسطة كائن المسار</span><br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span class="" title="">في هذا البرنامج التعليمي ، رأيت كيفية إنشاء كائنات المسار ، وقراءة الملفات وكتابتها ، ومعالجة المسارات ونظام الملفات الأساسي ، بالإضافة إلى بعض الأمثلة عن كيفية التكرار عبر العديد من مسارات الملفات.</span></span></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d9%88%d8%ad%d8%af%d8%a9-%d9%85%d8%b3%d8%a7%d8%b1-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-3-%d8%aa%d8%b1%d9%88%d9%8a%d8%b6-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d9%85%d9%84%d9%81%d8%a7%d8%aa/">وحدة مسار بايثون 3: ترويض نظام الملفات</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>وحدات وحزم بايثون &#8211; مقدمة</title>
		<link>https://arabdars.com/%d9%88%d8%ad%d8%af%d8%a7%d8%aa-%d9%88%d8%ad%d8%b2%d9%85-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%82%d8%af%d9%85%d8%a9/</link>
		
		<dc:creator><![CDATA[Reyhane]]></dc:creator>
		<pubDate>Mon, 21 Sep 2020 14:11:43 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1624</guid>

					<description><![CDATA[<p>جدول المحتويات وحدات بايثون: نظرة عامة مسار بحث الوحدة النمطية بيان الاستيراد استيراد &#60;module_name&#62; من &#60;module_name&#62; استيراد &#60;الاسم (الأسماء)&#62; من &#60;module_name&#62; استيراد &#60;name&#62; كـ &#60;alt_name&#62; استيراد &#60;module_name&#62; كـ &#60;alt_name&#62; دالة دير () تنفيذ وحدة كبرنامج نصي إعادة تحميل وحدة حزم بايثون تهيئة الحزمة استيراد * من حزمة الحزم الفرعية خاتمة تستكشف هذه المقالة وحدات Python [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d9%88%d8%ad%d8%af%d8%a7%d8%aa-%d9%88%d8%ad%d8%b2%d9%85-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%82%d8%af%d9%85%d8%a9/">وحدات وحزم بايثون &#8211; مقدمة</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">جدول المحتويات</span></strong></p>
<p></span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">وحدات بايثون: نظرة عامة<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">مسار بحث الوحدة النمطية<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بيان الاستيراد<br />
استيراد &lt;module_name&gt;<br />
من &lt;module_name&gt; استيراد &lt;الاسم (الأسماء)&gt;<br />
من &lt;module_name&gt; استيراد &lt;name&gt; كـ &lt;alt_name&gt;<br />
استيراد &lt;module_name&gt; كـ &lt;alt_name&gt;<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">دالة دير ()<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تنفيذ وحدة كبرنامج نصي<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إعادة تحميل وحدة<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">حزم بايثون<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تهيئة الحزمة<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">استيراد * من حزمة<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الحزم الفرعية<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">خاتمة<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تستكشف هذه المقالة وحدات Python وحزم Python ، وهما آليتان تسهّلان البرمجة المعيارية.</p>
<p>تشير البرمجة المعيارية إلى عملية تقسيم مهمة برمجة كبيرة غير عملية إلى مهام فرعية أو وحدات منفصلة وأصغر وأكثر قابلية للإدارة. يمكن بعد ذلك تجميع الوحدات الفردية معًا مثل اللبنات الأساسية لإنشاء تطبيق أكبر.</p>
<p>هناك العديد من المزايا لوحدة الكود في تطبيق كبير:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>البساطة:</strong> بدلاً من التركيز على المشكلة بأكملها ، تركز الوحدة عادةً على جزء صغير نسبيًا من المشكلة. إذا كنت تعمل على وحدة واحدة ، فسيكون لديك نطاق مشكلة أصغر للالتفاف حوله. هذا يجعل التطوير أسهل وأقل عرضة للخطأ.
<p></span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>قابلية الصيانة:</strong> يتم تصميم الوحدات النمطية عادةً بحيث تفرض الحدود المنطقية بين مجالات المشكلة المختلفة. إذا تمت كتابة الوحدات بطريقة تقلل من الاعتماد المتبادل ، فهناك احتمال أقل بأن التعديلات على وحدة واحدة سيكون لها تأثير على أجزاء أخرى من البرنامج. (قد تكون قادرًا على إجراء تغييرات على وحدة نمطية دون أن يكون لديك أي معرفة بالتطبيق خارج تلك الوحدة.) وهذا يجعل الأمر أكثر قابلية للتطبيق لفريق من المبرمجين للعمل بشكل تعاوني على تطبيق كبير.
<p></span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>قابلية إعادة الاستخدام:</strong> يمكن إعادة استخدام الوظيفة المحددة في وحدة واحدة بسهولة (من خلال واجهة محددة بشكل مناسب) بواسطة أجزاء أخرى من التطبيق. هذا يلغي الحاجة إلى تكرار التعليمات البرمجية.
<p></span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>تحديد النطاق:</strong> تحدد الوحدات عادةً مساحة اسم منفصلة ، مما يساعد على تجنب الاصطدامات بين المعرفات في مناطق مختلفة من البرنامج. (أحد المبادئ في Zen of Python هو أن Namespaces هي فكرة رائعة &#8211; فلنفعل المزيد منها!)<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الوظائف والوحدات والحزم كلها بنيات في بايثون تعزز تشكيل الكود.</p>
<p><strong><span style="font-size: 20pt">وحدات بايثون: نظرة عامة</span></strong></p>
<p>توجد في الواقع ثلاث طرق مختلفة لتعريف وحدة في بايثون:<br />
</span></p>
<ol>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن كتابة الوحدة في بايثون نفسها.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن كتابة وحدة في C وتحميلها ديناميكيًا في وقت التشغيل ، مثل وحدة re (التعبير العادي).<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">توجد وحدة مضمنة بشكل جوهري في المترجم الفوري ، مثل وحدة itertools.<br />
</span></li>
</ol>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يتم الوصول إلى محتويات الوحدة بنفس الطريقة في جميع الحالات الثلاث: مع بيان الاستيراد.</p>
<p>هنا ، سيكون التركيز في الغالب على الوحدات المكتوبة بلغة بايثون. إن الشيء الرائع في الوحدات المكتوبة بلغة بايثون هو أنها سهلة البناء للغاية. كل ما عليك فعله هو إنشاء ملف يحتوي على كود Python شرعي ثم إعطاء الملف اسمًا بامتداد .py. هذا هو! ليس هناك حاجة إلى صياغة خاصة أو الفودو.</p>
<p>على سبيل المثال ، افترض أنك قمت بإنشاء ملف يسمى mod.py يحتوي على ما يلي:</p>
<p><strong>mod.py</strong><br />
</span></p>
<pre><code><span class="n">s</span> <span class="o">=</span> <span class="s2">"If Comrade Napoleon says it, it must be right."</span>
<span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">300</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'arg = </span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يتم تحديد عدة كائنات في mod.py:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ق (سلسلة)<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">أ (قائمة)<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">foo</span><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"> () (دالة)<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">Foo (فصل دراسي)<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بافتراض وجود mod.py في موقع مناسب ، ستتعلم المزيد عنه قريبًا ، يمكن الوصول إلى هذه الكائنات عن طريق استيراد الوحدة على النحو التالي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">mod</span><span class="o">.</span><span class="n">s</span><span class="p">)</span>
<span class="go">If Comrade Napoleon says it, it must be right.</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="n">a</span>
<span class="go">[100, 200, 300]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="n">foo</span><span class="p">([</span><span class="s1">'quux'</span><span class="p">,</span> <span class="s1">'corge'</span><span class="p">,</span> <span class="s1">'grault'</span><span class="p">])</span>
<span class="go">arg = ['quux', 'corge', 'grault']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span>
<span class="go">&lt;mod.Foo object at 0x03C181F0&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">مسار بحث الوحدة النمطية</span></strong></p>
<p>متابعة للمثال أعلاه ، دعنا نلقي نظرة على ما يحدث عندما تنفذ بايثون العبارة:<br />
</span></p>
<pre><code><span class="kn">import</span> <span class="nn">mod</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">عندما ينفذ المترجم بيان الاستيراد أعلاه ، فإنه يبحث عن mod.py في قائمة الأدلة المجمعة من المصادر التالية:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الدليل الذي تم تشغيل نص الإدخال منه أو الدليل الحالي إذا كان المترجم يعمل بشكل تفاعلي<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">قائمة الدلائل الموجودة في متغير بيئة PYTHONPATH ، إذا تم تعيينها. (يعتمد تنسيق PYTHONPATH على نظام التشغيل ولكن يجب أن يحاكي متغير بيئة PATH.)<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">قائمة أدلة تعتمد على التثبيت تم تكوينها في وقت تثبيت Python<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن الوصول إلى مسار البحث الناتج في متغير Python sys.path ، والذي يتم الحصول عليه من وحدة نمطية تسمى sys:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">sys</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">sys</span><span class="o">.</span><span class="n">path</span>
<span class="go">['', 'C:\\Users\\john\\Documents\\Python\\doc', 'C:\\Python36\\Lib\\idlelib',</span>
<span class="go">'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib',</span>
<span class="go">'C:\\Python36', 'C:\\Python36\\lib\\site-packages']</span>
</code></pre>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ملاحظة: تعتمد المحتويات الدقيقة لـ sys.path على التثبيت. من شبه المؤكد أن ما سبق سيبدو مختلفًا قليلاً على جهاز الكمبيوتر الخاص بك.<br />
</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">وبالتالي ، للتأكد من العثور على الوحدة النمطية الخاصة بك ، عليك القيام بأحد الإجراءات التالية:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ضع mod.py في الدليل حيث يوجد نص الإدخال أو الدليل الحالي ، إذا كان تفاعليًا<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">قم بتعديل متغير بيئة PYTHONPATH ليحتوي على الدليل حيث يوجد mod.py قبل بدء تشغيل المترجم<br />
أو: ضع mod.py في أحد المجلدات الموجودة بالفعل في متغير PYTHONPATH<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ضع mod.py في أحد الأدلة المعتمدة على التثبيت ، والتي قد يكون لديك حق الوصول للكتابة إليها أو لا ، اعتمادًا على نظام التشغيل</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يوجد بالفعل خيار إضافي واحد: يمكنك وضع ملف الوحدة النمطية في أي دليل من اختيارك ثم تعديل sys.path في وقت التشغيل بحيث يحتوي على هذا الدليل. على سبيل المثال ، في هذه الحالة ، يمكنك وضع mod.py في الدليل C: \ Users \ john ثم إصدار العبارات التالية:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">r</span><span class="s1">'C:\Users\john'</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">sys</span><span class="o">.</span><span class="n">path</span>
<span class="go">['', 'C:\\Users\\john\\Documents\\Python\\doc', 'C:\\Python36\\Lib\\idlelib',</span>
<span class="go">'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib',</span>
<span class="go">'C:\\Python36', 'C:\\Python36\\lib\\site-packages', 'C:\\Users\\john']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بمجرد استيراد الوحدة ، يمكنك تحديد الموقع الذي تم العثور عليها فيه باستخدام سمة __ملف__ للوحدة:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="vm">__file__</span>
<span class="go">'C:\\Users\\john\\mod.py'</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">re</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">re</span><span class="o">.</span><span class="vm">__file__</span>
<span class="go">'C:\\Python36\\lib\\re.py'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يجب أن يكون جزء الدليل من __file__ أحد الأدلة في sys.path.</p>
<p><strong><span style="font-size: 20pt">بيان الاستيراد</span></strong></p>
<p>يتم توفير محتويات الوحدة للمتصل مع بيان الاستيراد. يأخذ بيان الاستيراد عدة أشكال مختلفة ، كما هو موضح أدناه.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>استيراد &lt;module_name&gt;</strong></p>
<p>أبسط شكل هو الذي سبق عرضه أعلاه:<br />
</span></p>
<pre><code><span class="kn">import</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ أن هذا لا يجعل محتويات الوحدة قابلة للوصول مباشرة إلى المتصل. تحتوي كل وحدة نمطية على جدول الرموز الخاص بها ، والذي يعمل كجدول الرموز العام لجميع الكائنات المحددة في الوحدة النمطية. وبالتالي ، فإن الوحدة النمطية تنشئ مساحة اسم منفصلة ، كما لوحظ بالفعل.</p>
<p>العبارة import &lt;module_name&gt; تضع فقط &lt;module_name&gt; في جدول رموز المتصل. تظل الكائنات المحددة في الوحدة النمطية في جدول الرموز الخاص بالوحدة النمطية.</p>
<p>من المتصل ، يمكن الوصول إلى الكائنات الموجودة في الوحدة فقط عندما تكون مسبوقة بـ &lt;module_name&gt; عبر تدوين النقطة ، كما هو موضح أدناه.</p>
<p>بعد بيان الاستيراد التالي ، يتم وضع mod في جدول الرموز المحلي. وبالتالي ، فإن mod لها معنى في السياق المحلي للمتصل:</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span>
<span class="go">&lt;module 'mod' from 'C:\\Users\\john\\Documents\\Python\\doc\\mod.py'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ولكن تظل s و foo في جدول الرموز الخاص بالوحدة وليست لها مغزى في السياق المحلي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">s</span>
<span class="go">NameError: name 's' is not defined</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">foo</span><span class="p">(</span><span class="s1">'quux'</span><span class="p">)</span>
<span class="go">NameError: name 'foo' is not defined</span></code><code>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ليتم الوصول إليها في السياق المحلي ، يجب أن تكون أسماء الكائنات المحددة في الوحدة مسبوقة بـ mod:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="n">s</span>
<span class="go">'If Comrade Napoleon says it, it must be right.'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="n">foo</span><span class="p">(</span><span class="s1">'quux'</span><span class="p">)</span>
<span class="go">arg = quux</span></code><code>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن تحديد عدة وحدات مفصولة بفواصل في بيان استيراد واحد:</span></p>
<p><code><span class="kn">import</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span><span class="p">[,</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="o">...</span><span class="p">]</span></code><code></code></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>من &lt;module_name&gt; استيراد &lt;الاسم (الأسماء)&gt;</strong></p>
<p>يسمح الشكل البديل لبيان الاستيراد باستيراد العناصر الفردية من الوحدة مباشرة إلى جدول رموز المتصل:<br />
</span></p>
<pre><code><span class="kn">from</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="kn">import</span> <span class="o">&lt;</span><span class="n">name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="o">&gt;</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بعد تنفيذ العبارة أعلاه ، يمكن الإشارة إلى &lt;name (s)&gt; في بيئة المتصل بدون البادئة &lt;module_name&gt;:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="n">s</span><span class="p">,</span> <span class="n">foo</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span>
<span class="go">'If Comrade Napoleon says it, it must be right.'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">foo</span><span class="p">(</span><span class="s1">'quux'</span><span class="p">)</span>
<span class="go">arg = quux</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="n">Foo</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span>
<span class="go">&lt;mod.Foo object at 0x02E3AD50&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">نظرًا لأن هذا النموذج من الاستيراد يضع أسماء الكائنات مباشرة في جدول رموز المتصل ، فسيتم استبدال أي كائنات موجودة بالفعل بنفس الاسم:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">,</span> <span class="s1">'baz'</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">a</span>
<span class="go">['foo', 'bar', 'baz']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="n">a</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">a</span>
<span class="go">[100, 200, 300]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">حتى أنه من الممكن استيراد كل شيء بشكل عشوائي من وحدة بضربة واحدة:<br />
</span></p>
<pre><code><span class="kn">from</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="kn">import</span> <span class="o">*</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">سيؤدي هذا إلى وضع أسماء جميع الكائنات من &lt;module_name&gt; في جدول الرموز المحلي ، باستثناء أي منها يبدأ بحرف التسطير السفلي (_).</p>
<p>فمثلا:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="o">*</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span>
<span class="go">'If Comrade Napoleon says it, it must be right.'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">a</span>
<span class="go">[100, 200, 300]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">foo</span>
<span class="go">&lt;function foo at 0x03B449C0&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Foo</span>
<span class="go">&lt;class 'mod.Foo'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لا ينصح بهذا بالضرورة في كود الإنتاج على نطاق واسع. إنه أمر خطير بعض الشيء لأنك تقوم بإدخال الأسماء في جدول الرموز المحلي بشكل جماعي. ما لم تكن تعرفهم جميعًا جيدًا ويمكن أن تكون واثقًا من أنه لن يكون هناك تعارض ، فلديك فرصة جيدة للكتابة فوق اسم موجود عن غير قصد. ومع ذلك ، فإن بناء الجملة هذا مفيد جدًا عندما تتجول فقط مع المترجم التفاعلي ، لأغراض الاختبار أو الاكتشاف ، لأنه يتيح لك الوصول بسرعة إلى كل ما تقدمه الوحدة دون الكثير من الكتابة.</p>
<p><strong>من &lt;module_name&gt; استيراد &lt;name&gt; كـ &lt;alt_name&gt;</strong></p>
<p>من الممكن أيضًا استيراد كائنات فردية ولكن إدخالها في جدول الرموز المحلي بأسماء بديلة:<br />
</span></p>
<pre><code><span class="kn">from</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="kn">import</span> <span class="o">&lt;</span><span class="n">name</span><span class="o">&gt;</span> <span class="k">as</span> <span class="o">&lt;</span><span class="n">alt_name</span><span class="o">&gt;</span><span class="p">[,</span> <span class="o">&lt;</span><span class="n">name</span><span class="o">&gt;</span> <span class="k">as</span> <span class="o">&lt;</span><span class="n">alt_name</span><span class="o">&gt;</span> <span class="err">…</span><span class="p">]</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هذا يجعل من الممكن وضع الأسماء مباشرة في جدول الرموز المحلي ولكن تجنب التعارض مع الأسماء الموجودة سابقًا:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="s1">'foo'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">,</span> <span class="s1">'baz'</span><span class="p">]</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="n">s</span> <span class="k">as</span> <span class="n">string</span><span class="p">,</span> <span class="n">a</span> <span class="k">as</span> <span class="n">alist</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span>
<span class="go">'foo'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">string</span>
<span class="go">'If Comrade Napoleon says it, it must be right.'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">a</span>
<span class="go">['foo', 'bar', 'baz']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">alist</span>
<span class="go">[100, 200, 300]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>استيراد &lt;module_name&gt; كـ &lt;alt_name&gt;</strong></p>
<p>يمكنك أيضًا استيراد وحدة كاملة تحت اسم بديل:<br />
</span></p>
<pre><code><span class="kn">import</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="k">as</span> <span class="o">&lt;</span><span class="n">alt_name</span><span class="o">&gt;</span></code></pre>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span> <span class="k">as</span> <span class="nn">my_module</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">my_module</span><span class="o">.</span><span class="n">a</span>
<span class="go">[100, 200, 300]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">my_module</span><span class="o">.</span><span class="n">foo</span><span class="p">(</span><span class="s1">'qux'</span><span class="p">)</span>
<span class="go">arg = qux</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن استيراد محتويات الوحدة النمطية من داخل تعريف دالة. في هذه الحالة ، لا يتم الاستيراد حتى يتم استدعاء الوظيفة:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">bar</span><span class="p">():</span>
<span class="gp">... </span>    <span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="n">foo</span>
<span class="gp">... </span>    <span class="n">foo</span><span class="p">(</span><span class="s1">'corge'</span><span class="p">)</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">bar</span><span class="p">()</span>
<span class="go">arg = corge</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ومع ذلك ، لا تسمح Python 3 ببناء جملة الاستيراد * العشوائي من داخل دالة:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">bar</span><span class="p">():</span>
<span class="gp">... </span>    <span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="o">*</span>
<span class="gp">...</span>
<span class="go">SyntaxError: import * only allowed at module level</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">أخيرًا ، يمكن استخدام عبارة try مع بند باستثناء ImportError للحماية من محاولات الاستيراد غير الناجحة:<br />
</span></p>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">try</span><span class="p">:</span>
<span class="gp">... </span>    <span class="c1"># Non-existent module</span>
<span class="gp">... </span>    <span class="kn">import</span> <span class="nn">baz</span>
<span class="gp">... </span><span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="s1">'Module not found'</span><span class="p">)</span>
<span class="gp">...</span>

<span class="go">Module not found</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">try</span><span class="p">:</span>
<span class="gp">... </span>    <span class="c1"># Existing module, but non-existent object</span>
<span class="gp">... </span>    <span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="n">baz</span>
<span class="gp">... </span><span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="s1">'Object not found in module'</span><span class="p">)</span>
<span class="gp">...</span>

<span class="go">Object not found in module</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">دالة دير ()</span></strong></p>
<p>ترجع الدالة المضمنة dir () قائمة بالأسماء المعرفة في مساحة اسم. بدون وسيطات ، ينتج قائمة بالأسماء مرتبة أبجديًا في جدول الرموز المحلي الحالي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">qux</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'qux']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Bar</span><span class="p">():</span>
<span class="gp">... </span>    <span class="k">pass</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Bar</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['Bar', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'qux', 'x']</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ كيف أن الاستدعاء الأول لـ dir () أعلاه يسرد عدة أسماء تم تحديدها تلقائيًا وفي مساحة الاسم بالفعل عند بدء المترجم. نظرًا لتعريف الأسماء الجديدة (qux ، Bar ، x) ، فإنها تظهر في الاستدعاءات اللاحقة لـ dir ().</p>
<p>يمكن أن يكون هذا مفيدًا لتحديد ما تمت إضافته إلى مساحة الاسم بالضبط بواسطة عبارة الاستيراد:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'mod']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="n">s</span>
<span class="go">'If Comrade Napoleon says it, it must be right.'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="n">foo</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
<span class="go">arg = [1, 2, 3]</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="n">a</span><span class="p">,</span> <span class="n">Foo</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['Foo', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'a', 'mod']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">a</span>
<span class="go">[100, 200, 300]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span>
<span class="go">&lt;mod.Foo object at 0x002EAD50&gt;</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="n">s</span> <span class="k">as</span> <span class="n">string</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['Foo', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'a', 'mod', 'string', 'x']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">string</span>
<span class="go">'If Comrade Napoleon says it, it must be right.'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">عند إعطاء وسيطة هي اسم الوحدة ، يسرد dir () الأسماء المحددة في الوحدة:<br />
</span></p>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
<span class="go">['Foo', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__',</span>
<span class="go">'__name__', '__package__', '__spec__', 'a', 'foo', 's']</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mod</span> <span class="kn">import</span> <span class="o">*</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['Foo', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'a', 'foo', 's']</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">تنفيذ وحدة كبرنامج نصي</span></strong></p>
<p>أي ملف .py يحتوي على وحدة هو في الأساس برنامج نصي بلغة Python ، وليس هناك أي سبب لعدم تنفيذه مثل أحد.</p>
<p>هنا مرة أخرى هو mod.py كما تم تعريفه أعلاه:</p>
<p><strong>mod.py</strong><br />
</span></p>
<pre><code><span class="n">s</span> <span class="o">=</span> <span class="s2">"If Comrade Napoleon says it, it must be right."</span>
<span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">300</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'arg = </span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن تشغيل هذا كبرنامج نصي:<br />
</span></p>
<pre><code><span class="gp">C:\Users\john\Documents&gt;</span>python mod.py
<span class="gp">C:\Users\john\Documents&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لا توجد أخطاء ، لذلك يبدو أنها عملت. صحيح أنها ليست ممتعة للغاية. كما هو مكتوب ، فإنه يحدد الأشياء فقط. لا يفعل أي شيء معهم ، ولا ينتج عنه أي ناتج.</p>
<p>دعنا نعدل وحدة Python أعلاه بحيث تولد بعض المخرجات عند تشغيلها كبرنامج نصي:</p>
<p><strong>mod.py</strong><br />
</span></p>
<pre><code><span class="n">s</span> <span class="o">=</span> <span class="s2">"If Comrade Napoleon says it, it must be right."</span>
<span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">300</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'arg = </span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
    <span class="k">pass</span>

<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="n">foo</span><span class="p">(</span><span class="s1">'quux'</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الآن يجب أن يكون الأمر أكثر إثارة للاهتمام:</span></p>
<pre><code><span class="gp">C:\Users\john\Documents&gt;</span>python mod.py
<span class="go">If Comrade Napoleon says it, it must be right.</span>
<span class="go">[100, 200, 300]</span>
<span class="go">arg = quux</span>
<span class="gp">&lt;__main__.Foo object at 0x02F101D0&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لسوء الحظ ، يقوم الآن أيضًا بإنشاء مخرجات عند استيراده كوحدة نمطية:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="go">If Comrade Napoleon says it, it must be right.</span>
<span class="go">[100, 200, 300]</span>
<span class="go">arg = quux</span>
<span class="go">&lt;mod.Foo object at 0x0169AD50&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هذا هو على الارجح ليس ما تريد. ليس من المعتاد لوحدة أن تولد مخرجات عند استيرادها.</p>
<p>ألن يكون من الجيد التمييز بين وقت تحميل الملف كوحدة وبين تشغيله كبرنامج نصي مستقل؟</p>
<p>اسأل وسوف تأخذ.</p>
<p>عندما يتم استيراد ملف .py كوحدة نمطية ، تعيّن Python المتغير الغامض الخاص __name__ لاسم الوحدة. ومع ذلك ، إذا تم تشغيل ملف كبرنامج نصي مستقل ، فسيتم تعيين __name__ (بشكل إبداعي) على السلسلة &#8220;__main__&#8221;. باستخدام هذه الحقيقة ، يمكنك تمييز الحالة في وقت التشغيل وتغيير السلوك وفقًا لذلك:</p>
<p><strong>mod.py</strong><br />
</span></p>
<pre><code><span class="n">s</span> <span class="o">=</span> <span class="s2">"If Comrade Napoleon says it, it must be right."</span>
<span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">300</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'arg = </span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
    <span class="k">pass</span>

<span class="k">if</span> <span class="p">(</span><span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">):</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'Executing as standalone script'</span><span class="p">)</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
    <span class="n">foo</span><span class="p">(</span><span class="s1">'quux'</span><span class="p">)</span>
    <span class="n">x</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الآن ، إذا قمت بتشغيل كبرنامج نصي ، فستحصل على الإخراج:<br />
</span></p>
<pre><code><span class="gp">C:\Users\john\Documents&gt;</span>python mod.py
<span class="go">Executing as standalone script</span>
<span class="go">If Comrade Napoleon says it, it must be right.</span>
<span class="go">[100, 200, 300]</span>
<span class="go">arg = quux</span>
<span class="gp">&lt;__main__.Foo object at 0x03450690&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ولكن إذا قمت بالاستيراد كوحدة نمطية ، فلن تقوم بما يلي:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="n">foo</span><span class="p">(</span><span class="s1">'grault'</span><span class="p">)</span>
<span class="go">arg = grault</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">غالبًا ما يتم تصميم الوحدات النمطية مع القدرة على التشغيل كنصوص مستقل لأغراض اختبار الوظائف الموجودة في الوحدة النمطية. يشار إلى هذا باسم اختبار الوحدة. على سبيل المثال ، لنفترض أنك أنشأت حقيقة وحدة نمطية تحتوي على دالة مضروب ، على النحو التالي:</p>
<p><strong>fact.py</strong><br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">fact</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="k">return</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">n</span> <span class="o">*</span> <span class="n">fact</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>

<span class="k">if</span> <span class="p">(</span><span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">):</span>
    <span class="kn">import</span> <span class="nn">sys</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="n">fact</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])))</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن التعامل مع الملف كوحدة نمطية ، واستيراد وظيفة fact ():<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">fact</span> <span class="kn">import</span> <span class="n">fact</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">fact</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span>
<span class="go">720</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ولكن يمكن أيضًا تشغيله كمستقل عن طريق تمرير وسيطة عدد صحيح في سطر الأوامر للاختبار:<br />
</span></p>
<pre><code><span class="gp">C:\Users\john\Documents&gt;</span>python fact.py 6
<span class="go">720</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">إعادة تحميل وحدة</span></strong></p>
<p>لأسباب تتعلق بالكفاءة ، يتم تحميل الوحدة مرة واحدة فقط لكل جلسة مترجم. هذا جيد بالنسبة لتعريفات الوظائف والفئات ، والتي عادة ما تشكل الجزء الأكبر من محتويات الوحدة. ولكن يمكن أن تحتوي الوحدة النمطية أيضًا على عبارات قابلة للتنفيذ ، عادةً للتهيئة. اعلم أنه سيتم تنفيذ هذه العبارات فقط في المرة الأولى التي يتم فيها استيراد وحدة نمطية.</p>
<p>ضع في اعتبارك ملف mod.py التالي:</p>
<p><strong>mod.py</strong><br />
</span></p>
<div class="highlight python">
<pre><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">300</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'a ='</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="go">a = [100, 200, 300]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">mod</span><span class="o">.</span><span class="n">a</span>
<span class="go">[100, 200, 300]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لا يتم تنفيذ جملة print () على عمليات الاستيراد اللاحقة. (بالنسبة لهذه المسألة ، لا يوجد بيان الإسناد ، ولكن كما يظهر العرض النهائي لقيمة mod.a ، فإن هذا لا يهم. بمجرد إجراء المهمة ، فإنها تظل ثابتة.)</p>
<p>إذا قمت بإجراء تغيير على وحدة ما وتحتاج إلى إعادة تحميلها ، فأنت بحاجة إما إلى إعادة تشغيل المترجم الفوري أو استخدام وظيفة تسمى إعادة التحميل () من الوحدة importlib:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>
<span class="go">a = [100, 200, 300]</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">mod</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">importlib</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">importlib</span><span class="o">.</span><span class="n">reload</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
<span class="go">a = [100, 200, 300]</span>
<span class="go">&lt;module 'mod' from 'C:\\Users\\john\\Documents\\Python\\doc\\mod.py'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">حزم بايثون</span></strong></p>
<p>لنفترض أنك طورت تطبيقًا كبيرًا جدًا يتضمن العديد من الوحدات. مع نمو عدد الوحدات ، يصبح من الصعب تتبعها جميعًا إذا تم إلقاؤها في مكان واحد. هذا صحيح بشكل خاص إذا كانت لديهم أسماء أو وظائف مماثلة. قد ترغب في وسيلة لتجميعهم وتنظيمهم.</p>
<p>تسمح الحزم بهيكلة هرمية لمساحة اسم الوحدة النمطية باستخدام تدوين النقطة. بالطريقة نفسها التي تساعد بها الوحدات النمطية في تجنب التضارب بين أسماء المتغيرات العامة ، تساعد الحزم في تجنب التصادم بين أسماء الوحدات.</p>
<p>يعد إنشاء حزمة أمرًا سهلاً للغاية ، حيث إنه يستخدم بنية الملفات الهرمية المتأصلة في نظام التشغيل. ضع في اعتبارك الترتيب التالي:<br />
</span></p>
<p><a href="https://files.realpython.com/media/pkg1.9af1c7aea48f.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block  aligncenter" src="https://files.realpython.com/media/pkg1.9af1c7aea48f.png" alt="Image of a Python package" width="177" height="139" /></a></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هنا ، يوجد دليل باسم pkg يحتوي على وحدتين ، mod1.py و mod2.py. محتويات الوحدات هي:</p>
<p><strong>mod1.py</strong><br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">foo</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod1] foo()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>mod2.py</strong></span><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">bar</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod2] bar()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Bar</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بالنظر إلى هذه البنية ، إذا كان دليل pkg موجودًا في مكان يمكن العثور عليه فيه (في أحد الأدلة الموجودة في sys.path) ، فيمكنك الرجوع إلى الوحدتين باستخدام تدوين النقطة (pkg.mod1 ، pkg.mod2) و قم باستيرادها بالصيغة التي تعرفها بالفعل:<br />
</span></p>
<div class="highlight python">
<pre><code><span class="kn">import</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span><span class="p">[,</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="o">...</span><span class="p">]</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">pkg.mod1</span><span class="o">,</span> <span class="nn">pkg.mod2</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span><span class="o">.</span><span class="n">mod1</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="go">[mod1] foo()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">pkg</span><span class="o">.</span><span class="n">mod2</span><span class="o">.</span><span class="n">Bar</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span>
<span class="go">&lt;pkg.mod2.Bar object at 0x033F7290&gt;</span>
</code></pre>
</div>
<div class="highlight python">
<pre><code><span class="kn">from</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="kn">import</span> <span class="o">&lt;</span><span class="n">name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="o">&gt;</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<div class="highlight python repl">
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.mod1</span> <span class="kn">import</span> <span class="n">foo</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">foo</span><span class="p">()</span>
<span class="go">[mod1] foo()</span>
</code></pre>
</div>
<div class="highlight python">
<pre><code><span class="kn">from</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="kn">import</span> <span class="o">&lt;</span><span class="n">name</span><span class="o">&gt;</span> <span class="k">as</span> <span class="o">&lt;</span><span class="n">alt_name</span><span class="o">&gt;</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.mod2</span> <span class="kn">import</span> <span class="n">Bar</span> <span class="k">as</span> <span class="n">Qux</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">Qux</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span>
<span class="go">&lt;pkg.mod2.Bar object at 0x036DFFD0&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكنك استيراد وحدات مع هذه العبارات أيضًا:<br />
</span></p>
<div class="highlight python">
<pre><code><span class="kn">from</span> <span class="o">&lt;</span><span class="n">package_name</span><span class="o">&gt;</span> <span class="kn">import</span> <span class="o">&lt;</span><span class="n">modules_name</span><span class="o">&gt;</span><span class="p">[,</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="o">...</span><span class="p">]</span>
<span class="kn">from</span> <span class="o">&lt;</span><span class="n">package_name</span><span class="o">&gt;</span> <span class="kn">import</span> <span class="o">&lt;</span><span class="n">module_name</span><span class="o">&gt;</span> <span class="k">as</span> <span class="o">&lt;</span><span class="n">alt_name</span><span class="o">&gt;</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg</span> <span class="kn">import</span> <span class="n">mod1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod1</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="go">[mod1] foo()</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg</span> <span class="kn">import</span> <span class="n">mod2</span> <span class="k">as</span> <span class="n">quux</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">quux</span><span class="o">.</span><span class="n">bar</span><span class="p">()</span>
<span class="go">[mod2] bar()</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكنك أيضًا استيراد الحزمة تقنيًا:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">pkg</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span>
<span class="go">&lt;module 'pkg' (namespace)&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لكن هذا قليل الفائدة. على الرغم من أن هذا ، بالمعنى الدقيق للكلمة ، بيان بايثون صحيح نحويًا ، إلا أنه لا يقدم الكثير من أي شيء مفيد. على وجه الخصوص ، لا يضع أيًا من الوحدات النمطية في pkg في مساحة الاسم المحلية:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span><span class="o">.</span><span class="n">mod1</span>
<span class="gt">Traceback (most recent call last):</span>
  File <span class="nb">"&lt;pyshell#34&gt;"</span>, line <span class="m">1</span>, in <span class="n">&lt;module&gt;</span>
    <span class="n">pkg</span><span class="o">.</span><span class="n">mod1</span>
<span class="gr">AttributeError</span>: <span class="n">module 'pkg' has no attribute 'mod1'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span><span class="o">.</span><span class="n">mod1</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="gt">Traceback (most recent call last):</span>
  File <span class="nb">"&lt;pyshell#35&gt;"</span>, line <span class="m">1</span>, in <span class="n">&lt;module&gt;</span>
    <span class="n">pkg</span><span class="o">.</span><span class="n">mod1</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="gr">AttributeError</span>: <span class="n">module 'pkg' has no attribute 'mod1'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span><span class="o">.</span><span class="n">mod2</span><span class="o">.</span><span class="n">Bar</span><span class="p">()</span>
<span class="gt">Traceback (most recent call last):</span>
  File <span class="nb">"&lt;pyshell#36&gt;"</span>, line <span class="m">1</span>, in <span class="n">&lt;module&gt;</span>
    <span class="n">pkg</span><span class="o">.</span><span class="n">mod2</span><span class="o">.</span><span class="n">Bar</span><span class="p">()</span>
<span class="gr">AttributeError</span>: <span class="n">module 'pkg' has no attribute 'mod2'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاستيراد الوحدات أو محتوياتها فعليًا ، تحتاج إلى استخدام أحد النماذج الموضحة أعلاه.</p>
<p><strong><span style="font-size: 20pt">تهيئة الحزمة</span></strong></p>
<p>إذا كان الملف المسمى __init__.py موجودًا في دليل الحزمة ، فسيتم استدعاؤه عند استيراد الحزمة أو الوحدة النمطية في الحزمة. يمكن استخدام هذا لتنفيذ كود تهيئة الحزمة ، مثل تهيئة بيانات مستوى الحزمة.</p>
<p>على سبيل المثال ، ضع في اعتبارك ملف __init__.py التالي:</p>
<p><strong>__init__.py</strong><br />
</span></p>
<pre><code><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Invoking __init__.py for </span><span class="si">{</span><span class="vm">__name__</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="n">A</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'quux'</span><span class="p">,</span> <span class="s1">'corge'</span><span class="p">,</span> <span class="s1">'grault'</span><span class="p">]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لنضيف هذا الملف إلى دليل pkg من المثال أعلاه:</span></p>
<p><a href="https://files.realpython.com/media/pkg2.dab97c2f9c58.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block  aligncenter" src="https://files.realpython.com/media/pkg2.dab97c2f9c58.png" alt="Illustration of hierarchical file structure of Python packages" width="221" height="181" /></a></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الآن عند استيراد الحزمة ، يتم تهيئة القائمة العامة A:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">pkg</span>
<span class="go">Invoking __init__.py for pkg</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span><span class="o">.</span><span class="n">A</span>
<span class="go">['quux', 'corge', 'grault']</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن لوحدة نمطية في الحزمة الوصول إلى المتغير العام عن طريق استيرادها بدوره:</p>
<p><strong>mod1.py</strong><br />
</span></p>
<div class="highlight python">
<pre><code><span class="k">def</span> <span class="nf">foo</span><span class="p">():</span>
    <span class="kn">from</span> <span class="nn">pkg</span> <span class="kn">import</span> <span class="n">A</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod1] foo() / A = '</span><span class="p">,</span> <span class="n">A</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg</span> <span class="kn">import</span> <span class="n">mod1</span>
<span class="go">Invoking __init__.py for pkg</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod1</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="go">[mod1] foo() / A =  ['quux', 'corge', 'grault']</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكن أيضًا استخدام __init__.py لإحداث استيراد تلقائي للوحدات من الحزمة. على سبيل المثال ، رأيت سابقًا أن العبارة import pkg تضع الاسم pkg فقط في جدول الرموز المحلي للمتصل ولا تستورد أي وحدات. ولكن إذا كان __init__.py في دليل pkg يحتوي على ما يلي:</p>
<p><strong>__init__.py</strong><br />
</span></p>
<pre><code><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Invoking __init__.py for </span><span class="si">{</span><span class="vm">__name__</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="kn">import</span> <span class="nn">pkg.mod1</span><span class="o">,</span> <span class="nn">pkg.mod2</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">عند تنفيذ استيراد pkg ، يتم استيراد الوحدتين mod1 و mod2 تلقائيًا:</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">pkg</span>
<span class="go">Invoking __init__.py for pkg</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span><span class="o">.</span><span class="n">mod1</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="go">[mod1] foo()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span><span class="o">.</span><span class="n">mod2</span><span class="o">.</span><span class="n">bar</span><span class="p">()</span>
<span class="go">[mod2] bar()</span>
</code></pre>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ملاحظة: تنص الكثير من وثائق Python على أن ملف __init__.py يجب أن يكون موجودًا في دليل الحزمة عند إنشاء حزمة. كان هذا صحيحًا في يوم من الأيام. اعتاد أن يكون وجود __init__.py يشير إلى Python أنه تم تعريف الحزمة. يمكن أن يحتوي الملف على رمز تهيئة أو قد يكون فارغًا ، ولكن يجب أن يكون موجودًا.</p>
<p>بدءًا من Python 3.3 ، تم تقديم حزم Namespace الضمنية. يسمح ذلك بإنشاء حزمة بدون أي ملف __init__.py. بالطبع ، يمكن أن يظل موجودًا إذا كانت هناك حاجة إلى تهيئة الحزمة. لكنها لم تعد مطلوبة.<br />
</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">استيراد * من حزمة</span></strong></p>
<p>لأغراض المناقشة التالية ، يتم توسيع الحزمة المحددة مسبقًا لتشمل بعض الوحدات النمطية الإضافية:</span></p>
<p><a href="https://files.realpython.com/media/pkg3.d2160908ae77.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block  aligncenter" src="https://files.realpython.com/media/pkg3.d2160908ae77.png" alt="Illustration of hierarchical file structure of Python packages" width="177" height="223" /></a></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يوجد الآن أربع وحدات معرفة في دليل pkg. محتوياتها كما هو موضح أدناه:</p>
<p><strong>mod1.py</strong><br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">foo</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod1] foo()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><br />
<strong>mod2.py</strong><br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">bar</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod2] bar()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Bar</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><br />
<strong>mod3.py</strong><br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">baz</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod3] baz()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Baz</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><br />
<strong>mod4.py</strong><br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">qux</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod4] qux()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Qux</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">(خيالي ، أليس كذلك؟)</p>
<p>لقد رأيت بالفعل أنه عند استخدام الاستيراد * لوحدة نمطية ، يتم استيراد جميع الكائنات من الوحدة النمطية إلى جدول الرموز المحلي ، باستثناء تلك التي تبدأ أسماؤها بشرطة سفلية ، كما هو الحال دائمًا:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.mod3</span> <span class="kn">import</span> <span class="o">*</span>

<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['Baz', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'baz']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">baz</span><span class="p">()</span>
<span class="go">[mod3] baz()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Baz</span>
<span class="go">&lt;class 'pkg.mod3.Baz'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">البيان المقابل للحزمة هو:<br />
</span></p>
<pre><code><span class="kn">from</span> <span class="o">&lt;</span><span class="n">package_name</span><span class="o">&gt;</span> <span class="kn">import</span> <span class="o">*</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ماذا يفعل ذلك؟<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg</span> <span class="kn">import</span> <span class="o">*</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__']</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">همف. ليس كثيرا. ربما كنت تتوقع (بافتراض أن لديك أي توقعات على الإطلاق) أن بايثون ستغوص في دليل الحزم ، وتجد كل الوحدات التي يمكنها ذلك ، وتستوردها جميعًا. لكن كما ترى ، هذا ليس ما يحدث بشكل افتراضي.</p>
<p>بدلاً من ذلك ، تتبع Python هذا الاصطلاح: إذا كان الملف __init__.py في دليل الحزمة يحتوي على قائمة باسم __all__ ، فسيتم اعتبارها قائمة بالوحدات التي يجب استيرادها عند مواجهة العبارة من &lt;package_name&gt; import *.</p>
<p>في المثال الحالي ، افترض أنك أنشأت __init__.py في دليل pkg مثل هذا:</p>
<p><strong>pkg / __ init__.py</strong><br />
</span></p>
<pre><code><span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
        <span class="s1">'mod1'</span><span class="p">,</span>
        <span class="s1">'mod2'</span><span class="p">,</span>
        <span class="s1">'mod3'</span><span class="p">,</span>
        <span class="s1">'mod4'</span>
        <span class="p">]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الآن من استيراد pkg * يستورد جميع الوحدات الأربع:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg</span> <span class="kn">import</span> <span class="o">*</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'mod1', 'mod2', 'mod3', 'mod4']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod2</span><span class="o">.</span><span class="n">bar</span><span class="p">()</span>
<span class="go">[mod2] bar()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod4</span><span class="o">.</span><span class="n">Qux</span>
<span class="go">&lt;class 'pkg.mod4.Qux'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لا يزال استخدام الاستيراد * لا يُعتبر شكلاً رائعًا ، أكثر من الحزم مقارنة بالوحدات النمطية. لكن هذه الميزة على الأقل تمنح منشئ الحزمة بعض التحكم فيما يحدث عند تحديد الاستيراد *. (في الواقع ، يوفر القدرة على عدم السماح به تمامًا ، ببساطة عن طريق رفض تعريف __all__ على الإطلاق. كما رأيت ، فإن السلوك الافتراضي للحزم هو عدم استيراد أي شيء.)</p>
<p>بالمناسبة ، يمكن تعريف __all__ في وحدة أيضًا ويخدم نفس الغرض: للتحكم في ما يتم استيراده مع الاستيراد *. على سبيل المثال ، قم بتعديل mod1.py على النحو التالي:</p>
<p><strong>pkg / mod1.py</strong><br />
</span></p>
<pre><code><span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'foo'</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">foo</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod1] foo()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Foo</span><span class="p">:</span>
    <span class="k">pass</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الآن ستقوم عبارة import * من pkg.mod1 باستيراد ما هو وارد في __all__:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.mod1</span> <span class="kn">import</span> <span class="o">*</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">dir</span><span class="p">()</span>
<span class="go">['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',</span>
<span class="go">'__package__', '__spec__', 'foo']</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">foo</span><span class="p">()</span>
<span class="go">[mod1] foo()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">Foo</span>
<span class="gt">Traceback (most recent call last):</span>
  File <span class="nb">"&lt;pyshell#37&gt;"</span>, line <span class="m">1</span>, in <span class="n">&lt;module&gt;</span>
    <span class="n">Foo</span>
<span class="gr">NameError</span>: <span class="n">name 'Foo' is not defined</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">foo () (الوظيفة) مُعرَّفة الآن في مساحة الاسم المحلية ، ولكن Foo (الفئة) ليست كذلك ، لأن الأخير ليس في __all__.</p>
<p>باختصار ، يتم استخدام __all__ بواسطة كلٍ من الحزم والوحدات للتحكم في ما يتم استيراده عند تحديد الاستيراد *. لكن السلوك الافتراضي يختلف:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بالنسبة للحزمة ، عندما لا يتم تعريف __all__ ، لا يستورد الاستيراد * أي شيء.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بالنسبة إلى وحدة نمطية ، عندما لا يتم تعريف __all__ ، يقوم الاستيراد * باستيراد كل شيء (باستثناء &#8211; كما خمنت &#8211; الأسماء التي تبدأ بشرطة سفلية).<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">الحزم الفرعية</span></strong></p>
<p>يمكن أن تحتوي الحزم على حزم فرعية متداخلة إلى عمق عشوائي. على سبيل المثال ، دعونا نجري تعديلًا آخر على مثال دليل الحزمة على النحو التالي:</span></p>
<p><a href="https://files.realpython.com/media/pkg4.a830d6e144bf.png" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="img-fluid mx-auto d-block  aligncenter" src="https://files.realpython.com/media/pkg4.a830d6e144bf.png" alt="Illustration of hierarchical file structure of Python packages" width="229" height="317" /></a></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تم تعريف الوحدات الأربعة (mod1.py و mod2.py و mod3.py و mod4.py) على النحو السابق. ولكن الآن ، بدلاً من تجميعها معًا في دليل pkg ، يتم تقسيمها إلى مجلدين فرعيين ، sub_pkg1 و sub_pkg2.</p>
<p>لا يزال الاستيراد يعمل كما هو موضح سابقًا. بناء الجملة مشابه ، ولكن يتم استخدام تدوين نقطي إضافي لفصل اسم الحزمة عن اسم الحزمة الفرعية:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">pkg.sub_pkg1.mod1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pkg</span><span class="o">.</span><span class="n">sub_pkg1</span><span class="o">.</span><span class="n">mod1</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="go">[mod1] foo()</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.sub_pkg1</span> <span class="kn">import</span> <span class="n">mod2</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod2</span><span class="o">.</span><span class="n">bar</span><span class="p">()</span>
<span class="go">[mod2] bar()</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.sub_pkg2.mod3</span> <span class="kn">import</span> <span class="n">baz</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">baz</span><span class="p">()</span>
<span class="go">[mod3] baz()</span>

<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.sub_pkg2.mod4</span> <span class="kn">import</span> <span class="n">qux</span> <span class="k">as</span> <span class="n">grault</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">grault</span><span class="p">()</span>
<span class="go">[mod4] qux()</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بالإضافة إلى ذلك ، يمكن للوحدة في حزمة فرعية واحدة أن تشير إلى كائنات في حزمة فرعية للأشقاء (في حالة احتواء الأخوة على بعض الوظائف التي تحتاجها). على سبيل المثال ، افترض أنك تريد استيراد وظيفة foo () وتنفيذها (محددة في الوحدة النمطية 1) من داخل الوحدة النمطية 3. يمكنك إما استخدام استيراد مطلق:</p>
<p><strong>pkg / sub__pkg2 / mod3.py</strong><br />
</span></p>
<div class="highlight python">
<pre><code><span class="k">def</span> <span class="nf">baz</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod3] baz()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Baz</span><span class="p">:</span>
    <span class="k">pass</span>

<span class="kn">from</span> <span class="nn">pkg.sub_pkg1.mod1</span> <span class="kn">import</span> <span class="n">foo</span>
<span class="n">foo</span><span class="p">()</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.sub_pkg2</span> <span class="kn">import</span> <span class="n">mod3</span>
<span class="go">[mod1] foo()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">mod3</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="go">[mod1] foo()</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">أو يمكنك استخدام استيراد نسبي ، حيث .. يشير إلى الحزمة ذات المستوى الأعلى. من داخل mod3.py ، الموجودة في الحزمة الفرعية sub_pkg2 ،<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">.. يقيّم الحزمة الأصلية (pkg) ، و<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يتم تقييم ..sub_pkg1 إلى subpackage sub_pkg1 من الحزمة الرئيسية.<br />
</span></li>
</ul>
<p><strong><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">pkg / sub__pkg2 / mod3.py</span></strong><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><br />
</span></p>
<div class="highlight python">
<pre><code><span class="k">def</span> <span class="nf">baz</span><span class="p">():</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">'[mod3] baz()'</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Baz</span><span class="p">:</span>
    <span class="k">pass</span>

<span class="kn">from</span> <span class="nn">..</span> <span class="kn">import</span> <span class="n">sub_pkg1</span>
<span class="nb">print</span><span class="p">(</span><span class="n">sub_pkg1</span><span class="p">)</span>

<span class="kn">from</span> <span class="nn">..sub_pkg1.mod1</span> <span class="kn">import</span> <span class="n">foo</span>
<span class="n">foo</span><span class="p">()</span>
</code></pre>
</div>
<div class="highlight python repl"></div>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pkg.sub_pkg2</span> <span class="kn">import</span> <span class="n">mod3</span>
<span class="go">&lt;module 'pkg.sub_pkg1' (namespace)&gt;</span>
<span class="go">[mod1] foo()</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">خاتمة</span></strong></p>
<p>لقد غطيت في هذا البرنامج التعليمي المواضيع التالية:<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كيفية إنشاء وحدة Python<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">المواقع التي يبحث فيها مترجم Python عن وحدة نمطية<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كيفية الوصول إلى الكائنات المحددة في وحدة نمطية مع بيان الاستيراد<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كيفية إنشاء وحدة قابلة للتنفيذ كبرنامج نصي مستقل<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كيفية تنظيم الوحدات في حزم وحزم فرعية<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كيفية التحكم في تهيئة الحزمة<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">نأمل أن يتيح لك ذلك فهمًا أفضل لكيفية الوصول إلى الوظائف المتاحة في العديد من الوحدات النمطية التابعة للجهات الخارجية والمدمجة المتوفرة في Python.</p>
<p>بالإضافة إلى ذلك ، إذا كنت تقوم بتطوير التطبيق الخاص بك ، فإن إنشاء الوحدات والحزم الخاصة بك سيساعدك على تنظيم التعليمات البرمجية الخاصة بك وجعلها نموذجية ، مما يجعل الترميز والصيانة وتصحيح الأخطاء أسهل.</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span class="" title="">إذا كنت تريد معرفة المزيد ، فراجع الوثائق التالية على موقع Python.org:</span><br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span title="">نظام الاستيراد</span><br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span title="">دروس بايثون: الوحدات</span><br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><span title="">بايثونينج سعيد!</span></span></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d9%88%d8%ad%d8%af%d8%a7%d8%aa-%d9%88%d8%ad%d8%b2%d9%85-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%82%d8%af%d9%85%d8%a9/">وحدات وحزم بايثون &#8211; مقدمة</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>العمل مع بيانات JSON في بايثون</title>
		<link>https://arabdars.com/%d8%a7%d9%84%d8%b9%d9%85%d9%84-%d9%85%d8%b9-%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-json-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/</link>
		
		<dc:creator><![CDATA[Reyhane]]></dc:creator>
		<pubDate>Sun, 20 Sep 2020 09:04:15 +0000</pubDate>
				<category><![CDATA[الماتلاب Matlab]]></category>
		<guid isPermaLink="false">https://arabdars.com/?p=1621</guid>

					<description><![CDATA[<p>جدول المحتويات تاريخ موجز (جدًا) لـ JSON انظروا ، إنه JSON! لغة Python تدعم JSON أصلاً! القليل من المفردات تسلسل JSON مثال بسيط على التسلسل بعض حجج الكلمات الرئيسية المفيدة إلغاء تسلسل JSON مثال بسيط على إلغاء التسلسل مثال من العالم الحقيقي (نوعًا ما) ترميز وفك ترميز كائنات Python المخصصة تبسيط هياكل البيانات ترميز أنواع [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%a7%d9%84%d8%b9%d9%85%d9%84-%d9%85%d8%b9-%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-json-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/">العمل مع بيانات JSON في بايثون</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">جدول المحتويات<br />
</span></p>
<ul>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تاريخ موجز (جدًا) لـ JSON<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">انظروا ، إنه JSON!<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لغة Python تدعم JSON أصلاً!<br />
القليل من المفردات<br />
تسلسل JSON<br />
مثال بسيط على التسلسل<br />
بعض حجج الكلمات الرئيسية المفيدة<br />
إلغاء تسلسل JSON<br />
مثال بسيط على إلغاء التسلسل<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">مثال من العالم الحقيقي (نوعًا ما)<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ترميز وفك ترميز كائنات Python المخصصة<br />
تبسيط هياكل البيانات<br />
ترميز أنواع مخصصة<br />
أنواع مخصصة فك التشفير<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كله تمام!<br />
</span></li>
</ul>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">منذ نشأتها ، سرعان ما أصبحت JSON المعيار الفعلي لتبادل المعلومات. من المحتمل أنك هنا لأنك تحتاج إلى نقل بعض البيانات من هنا إلى هناك. من المحتمل أنك تجمع المعلومات من خلال واجهة برمجة التطبيقات أو تخزن بياناتك في قاعدة بيانات المستندات. بطريقة أو بأخرى ، ستصل إلى مستوى رقبتك في JSON ، ويجب عليك الخروج من Python.</p>
<p>لحسن الحظ ، هذه مهمة شائعة جدًا ، وكما هو الحال مع المهام الأكثر شيوعًا ، فإن بايثون تجعلها سهلة بشكل مثير للاشمئزاز. لا تخف يا رفاق بايثونير و بايثونيستاس. هذا سيكون نسيم!<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذن ، نستخدم JSON لتخزين البيانات وتبادلها؟ نعم ، لقد حصلت عليه! إنه ليس أكثر من تنسيق قياسي يستخدمه المجتمع لتمرير البيانات. ضع في اعتبارك أن JSON ليس التنسيق الوحيد المتاح لهذا النوع من العمل ، ولكن XML و YAML هما على الأرجح التنسيقان الآخران الوحيدان اللذان يستحق الذكر في نفس الوقت.</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">تاريخ موجز (جدًا) لـ JSON</span></strong></p>
<p>ليس من المستغرب أن JavaScript Object Notation مستوحى من مجموعة فرعية من لغة برمجة JavaScript التي تتعامل مع بناء الجملة الحرفية للكائن. لديهم موقع أنيق يشرح الأمر برمته. لا داعي للقلق: لقد أصبحت JSON منذ فترة طويلة حيادية اللغة وهي موجودة كمعيارها الخاص ، لذلك يمكننا لحسن الحظ تجنب JavaScript من أجل هذه المناقشة.</p>
<p>في النهاية ، اعتمد المجتمع ككل JSON لأنه من السهل على كل من البشر والآلات الإنشاء والفهم.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">انظروا ، إنه JSON!</span></strong></p>
<p>إستعد. أنا على وشك أن أريكم بعض صور JSON الواقعية &#8211; تمامًا كما كنت سترى هناك في البرية. لا بأس: من المفترض أن تكون لغة JSON قابلة للقراءة من قبل أي شخص يستخدم لغة من النمط C ، و Python هي لغة من النمط C &#8230; لذلك هذا أنت!<br />
</span></p>
<pre><code><span class="p">{</span>
    <span class="nt">"firstName"</span><span class="p">:</span> <span class="s2">"Jane"</span><span class="p">,</span>
    <span class="nt">"lastName"</span><span class="p">:</span> <span class="s2">"Doe"</span><span class="p">,</span>
    <span class="nt">"hobbies"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"running"</span><span class="p">,</span> <span class="s2">"sky diving"</span><span class="p">,</span> <span class="s2">"singing"</span><span class="p">],</span>
    <span class="nt">"age"</span><span class="p">:</span> <span class="mi">35</span><span class="p">,</span>
    <span class="nt">"children"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
            <span class="nt">"firstName"</span><span class="p">:</span> <span class="s2">"Alice"</span><span class="p">,</span>
            <span class="nt">"age"</span><span class="p">:</span> <span class="mi">6</span>
        <span class="p">},</span>
        <span class="p">{</span>
            <span class="nt">"firstName"</span><span class="p">:</span> <span class="s2">"Bob"</span><span class="p">,</span>
            <span class="nt">"age"</span><span class="p">:</span> <span class="mi">8</span>
        <span class="p">}</span>
    <span class="p">]</span>
<span class="p">}</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كما ترى ، يدعم JSON الأنواع الأولية ، مثل السلاسل والأرقام ، بالإضافة إلى القوائم والكائنات المتداخلة.<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">انتظر ، هذا يشبه قاموس بايثون! أنا أوافق؟ إنه رمز كائن عالمي إلى حد كبير في هذه المرحلة ، لكنني لا أعتقد أن UON يتدحرج على لسانه بشكل جيد تمامًا. لا تتردد في مناقشة البدائل في التعليقات.<br />
</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يا للعجب! لقد نجوت من مواجهتك الأولى مع بعض JSON البرية. الآن تحتاج فقط إلى تعلم كيفية ترويضها.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">لغة Python تدعم JSON أصلاً!</span></strong></p>
<p>تأتي Python مع حزمة مدمجة تسمى json لتشفير وفك تشفير بيانات JSON.</p>
<p>فقط ارمي هذا الرجل الصغير في أعلى الملف الخاص بك:<br />
</span></p>
<pre><code><span class="kn">import</span> <span class="nn">json</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>القليل من المفردات</strong></p>
<p>عادةً ما تسمى عملية تشفير JSON التسلسل. يشير هذا المصطلح إلى تحويل البيانات إلى سلسلة من البايتات (ومن ثم التسلسلية) ليتم تخزينها أو نقلها عبر الشبكة. قد تسمع أيضًا مصطلح التنظيم ، ولكن هذه مناقشة أخرى كاملة. بطبيعة الحال ، فإن إلغاء التسلسل هو عملية متبادلة لفك تشفير البيانات التي تم تخزينها أو تسليمها في معيار JSON.<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ييكيس! هذا يبدو تقنيًا جدًا. قطعا. لكن في الواقع ، كل ما نتحدث عنه هنا هو القراءة والكتابة. فكر في الأمر على هذا النحو: الترميز هو لكتابة البيانات على القرص ، بينما فك التشفير هو لقراءة البيانات في الذاكرة.</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>تسلسل JSON</strong></p>
<p>ماذا يحدث بعد معالجة الكمبيوتر للكثير من المعلومات؟ يجب أن تأخذ تفريغ البيانات. وفقًا لذلك ، تعرض مكتبة json طريقة التفريغ () لكتابة البيانات إلى الملفات. هناك أيضًا طريقة dumps () (تُنطق باسم &#8220;dump-s&#8221;) للكتابة إلى سلسلة Python.</p>
<p>يتم ترجمة كائنات Python البسيطة إلى JSON وفقًا لتحويل بديهي إلى حد ما.<br />
Python JSON<br />
كائن ديكت<br />
قائمة ، مجموعة الصفيف<br />
سلسلة str<br />
عدد صحيح ، طويل ، عائم<br />
حقيقي حقيقي<br />
خطأ خطأ<br />
لا شيء فارغ</p>
<p><strong>مثال بسيط على التسلسل</strong></p>
<p>تخيل أنك تعمل مع كائن Python في الذاكرة يبدو قليلاً مثل هذا:<br />
</span></p>
<pre><code><span class="n">data</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s2">"president"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s2">"name"</span><span class="p">:</span> <span class="s2">"Zaphod Beeblebrox"</span><span class="p">,</span>
        <span class="s2">"species"</span><span class="p">:</span> <span class="s2">"Betelgeusian"</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">من الأهمية بمكان أن تقوم بحفظ هذه المعلومات على القرص ، لذا فإن مهمتك هي كتابتها في ملف.</p>
<p>باستخدام مدير سياق Python ، يمكنك إنشاء ملف يسمى data_file.json وفتحه في وضع الكتابة. (تنتهي ملفات JSON بسهولة بامتداد .json.)<br />
</span></p>
<pre><code><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"data_file.json"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">write_file</span><span class="p">:</span>
    <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">write_file</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ أن dump () يأخذ وسيطين موضعيين: (1) كائن البيانات المراد تسلسله ، و (2) الكائن الشبيه بالملف الذي سيتم كتابة البايت عليه.</p>
<p>أو ، إذا كنت تميل إلى الاستمرار في استخدام بيانات JSON المتسلسلة هذه في برنامجك ، فيمكنك كتابتها إلى كائن Python str أصلي.<br />
</span></p>
<pre><code><span class="n">json_string</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ أن الكائن الذي يشبه الملف غائب نظرًا لأنك لا تكتب فعليًا على القرص. بخلاف ذلك ، فإن عمليات التفريغ () تشبه تمامًا التفريغ ().</p>
<p>الصيحة! لقد أنجبت طفلاً JSON ، وأنت على استعداد لإطلاقه في البرية لتنمو بشكل كبير وقوي.<br />
</span></p>
<p><strong><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بعض حجج الكلمات الرئيسية المفيدة</span></strong></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">تذكر أنه من المفترض أن تكون لغة JSON سهلة القراءة من قِبل البشر ، إلا أن البنية القابلة للقراءة لا تكفي إذا تم دمجها معًا. بالإضافة إلى أنه من المحتمل أن يكون لديك أسلوب برمجة مختلف عني ، وقد يكون من الأسهل بالنسبة لك قراءة التعليمات البرمجية عندما يتم تنسيقها حسب رغبتك.<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ملاحظة: كلا الأسلوبين dump () و dumps () تستخدمان نفس الوسيطات الأساسية.</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الخيار الأول الذي يريد معظم الناس تغييره هو المسافة البيضاء. يمكنك استخدام وسيطة الكلمة الأساسية للمسافة البادئة لتحديد حجم المسافة البادئة للبنى المتداخلة. تحقق من الاختلاف بنفسك باستخدام البيانات ، التي حددناها أعلاه ، وتشغيل الأوامر التالية في وحدة التحكم:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">خيار تنسيق آخر هو وسيطة الكلمات الأساسية الفواصل. بشكل افتراضي ، هذه هي مجموعتان من السلاسل الفاصلة (&#8220;،&#8221;، &#8220;:&#8221;) ، ولكن البديل الشائع لـ JSON المضغوط هو (&#8220;،&#8221;، &#8220;:&#8221;). ألقِ نظرة على نموذج JSON مرة أخرى لترى أين تلعب هذه الفواصل.</p>
<p>هناك آخرون ، مثل sort_keys ، لكن ليس لدي أي فكرة عما يفعله هذا الشخص. يمكنك العثور على قائمة كاملة في المستندات إذا كنت مهتمًا.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>إلغاء تسلسل JSON</strong></p>
<p>رائع ، يبدو أنك قد التقطت لنفسك بعض JSON البري! حان الوقت الآن لإضفاء الشكل. في مكتبة json ، ستجد load () و load () لتحويل البيانات المشفرة JSON إلى كائنات Python.</p>
<p>تمامًا مثل التسلسل ، يوجد جدول تحويل بسيط لإلغاء التسلسل ، على الرغم من أنه يمكنك على الأرجح تخمين كيف يبدو بالفعل.<br />
جسون بايثون<br />
كائن ديكت<br />
قائمة الصفيف<br />
سلسلة سلسلة<br />
عدد (كثافة العمليات)<br />
عدد (حقيقي) عائم<br />
حقيقي حقيقي<br />
خطأ خطأ<br />
لا شيء لا شيء</p>
<p>من الناحية الفنية ، لا يمثل هذا التحويل معكوسًا مثاليًا لجدول التسلسل. هذا يعني بشكل أساسي أنه إذا قمت بترميز كائن الآن ثم فك تشفيره مرة أخرى لاحقًا ، فقد لا تحصل على نفس الكائن مرة أخرى. أتخيل أنه يشبه إلى حد ما النقل الآني: قم بتكسير جزيئاتي هنا وإعادة تجميعها مرة أخرى هناك. هل ما زلت نفس الشخص؟</p>
<p>في الواقع ، ربما يكون الأمر أشبه بإقناع صديق بترجمة شيء ما إلى اليابانية وصديق آخر لترجمته مرة أخرى إلى اللغة الإنجليزية. بغض النظر ، فإن أبسط مثال هو ترميز tuple واستعادة قائمة بعد فك التشفير ، مثل:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">blackjack_hand</span> <span class="o">=</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="s2">"Q"</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">encoded_hand</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">blackjack_hand</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">decoded_hand</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">encoded_hand</span><span class="p">)</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">blackjack_hand</span> <span class="o">==</span> <span class="n">decoded_hand</span>
<span class="go">False</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">blackjack_hand</span><span class="p">)</span>
<span class="go">&lt;class 'tuple'&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">decoded_hand</span><span class="p">)</span>
<span class="go">&lt;class 'list'&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">blackjack_hand</span> <span class="o">==</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">decoded_hand</span><span class="p">)</span>
<span class="go">True</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>مثال بسيط على إلغاء التسلسل</strong></p>
<p>هذه المرة ، تخيل أن لديك بعض البيانات المخزنة على القرص والتي ترغب في معالجتها في الذاكرة. ستظل تستخدم مدير السياق ، ولكن هذه المرة ستفتح ملف data_file.json الحالي في وضع القراءة.<br />
</span></p>
<pre><code><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"data_file.json"</span><span class="p">,</span> <span class="s2">"r"</span><span class="p">)</span> <span class="k">as</span> <span class="n">read_file</span><span class="p">:</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">read_file</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الأمور واضحة ومباشرة هنا ، ولكن ضع في اعتبارك أن نتيجة هذه الطريقة يمكن أن ترجع أيًا من أنواع البيانات المسموح بها من جدول التحويل. هذا مهم فقط إذا كنت تقوم بتحميل بيانات لم تراها من قبل. في معظم الحالات ، سيكون الكائن الجذر عبارة عن إملاء أو قائمة.</p>
<p>إذا كنت قد سحبت بيانات JSON من برنامج آخر أو حصلت بطريقة أخرى على سلسلة من البيانات بتنسيق JSON في Python ، فيمكنك إلغاء تسلسل ذلك بسهولة باستخدام الأحمال () ، والتي يتم تحميلها بشكل طبيعي من سلسلة:<br />
</span></p>
<pre><code><span class="n">json_string</span> <span class="o">=</span> <span class="s2">"""</span>
<span class="s2">{</span>
<span class="s2">    "researcher": {</span>
<span class="s2">        "name": "Ford Prefect",</span>
<span class="s2">        "species": "Betelgeusian",</span>
<span class="s2">        "relatives": [</span>
<span class="s2">            {</span>
<span class="s2">                "name": "Zaphod Beeblebrox",</span>
<span class="s2">                "species": "Betelgeusian"</span>
<span class="s2">            }</span>
<span class="s2">        ]</span>
<span class="s2">    }</span>
<span class="s2">}</span>
<span class="s2">"""</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">json_string</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هاهو! لقد قمت بترويض JSON البري ، وهو الآن تحت سيطرتك. لكن ما تفعله بهذه القوة متروك لك. يمكنك إطعامها ، ورعايتها ، وحتى تعليمها الحيل. ليس الأمر أنني لا أثق بك &#8230; لكني أبقيه مقيدًا ، حسنًا؟<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">مثال من العالم الحقيقي (نوعًا ما)</span></strong></p>
<p>لمثالك التمهيدي ، ستستخدم JSONPlaceholder ، وهو مصدر رائع لبيانات JSON المزيفة لأغراض التدريب.</p>
<p>قم أولاً بإنشاء ملف نصي يسمى scratch.py ​​، أو أي شيء تريده. لا أستطيع حقًا إيقافك.</p>
<p>ستحتاج إلى تقديم طلب واجهة برمجة التطبيقات إلى خدمة JSONPlaceholder ، لذلك ما عليك سوى استخدام حزمة الطلبات للقيام بالأعباء الثقيلة. أضف هذه الواردات في الجزء العلوي من ملفك:<br />
</span></p>
<pre><code><span class="kn">import</span> <span class="nn">json</span>
<span class="kn">import</span> <span class="nn">requests</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الآن ، ستعمل مع قائمة TODOs مثل &#8230; كما تعلم ، إنها طقوس المرور أو أي شيء آخر.</p>
<p>انطلق وقم بتقديم طلب إلى JSONPlaceholder API لنقطة نهاية todos /. إذا لم تكن على دراية بالطلبات ، فهناك بالفعل طريقة json () مفيدة ستؤدي كل العمل نيابة عنك ، ولكن يمكنك التدرب على استخدام مكتبة json لإلغاء تسلسل سمة النص لكائن الاستجابة. يجب أن يبدو مثل هذا:<br />
</span></p>
<pre><code><span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"https://jsonplaceholder.typicode.com/todos"</span><span class="p">)</span>
<span class="n">todos</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لا تعتقد أن هذا يعمل؟ حسنًا ، قم بتشغيل الملف في الوضع التفاعلي واختبره بنفسك. أثناء تواجدك فيه ، تحقق من نوع المهام. إذا كنت تشعر بالمغامرة ، ألق نظرة خاطفة على أول 10 عناصر أو نحو ذلك في القائمة.<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">todos</span> <span class="o">==</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
<span class="go">True</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">todos</span><span class="p">)</span>
<span class="go">&lt;class 'list'&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">todos</span><span class="p">[:</span><span class="mi">10</span><span class="p">]</span>
<span class="gp">...</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">انظر ، لن أكذب عليك ، لكنني سعيد لأنك متشكك.<br />
</span></p>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ما هو الوضع التفاعلي؟ آه ، أعتقد أنك لن تسأل أبدًا! هل تعرف كيف تقفز دائمًا ذهابًا وإيابًا بين المحرر والمحطة؟ حسنًا ، نحن مستخدمي Pythoneers الخادعين نستخدم العلامة التفاعلية -i عند تشغيل البرنامج النصي. هذه خدعة صغيرة رائعة لاختبار الكود لأنه يقوم بتشغيل البرنامج النصي ثم يفتح موجه أوامر تفاعلي مع إمكانية الوصول إلى جميع البيانات من البرنامج النصي!<br />
</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">حسنًا ، حان الوقت لبعض العمل. يمكنك رؤية بنية البيانات من خلال زيارة نقطة النهاية في المتصفح ، ولكن إليك نموذج TODO:<br />
</span></p>
<pre><code><span class="p">{</span>
    <span class="nt">"userId"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
    <span class="nt">"id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
    <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"delectus aut autem"</span><span class="p">,</span>
    <span class="nt">"completed"</span><span class="p">:</span> <span class="kc">false</span>
<span class="p">}</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هناك عدة مستخدمين ، لكل منهم معرف مستخدم فريد ، ولكل مهمة خاصية مكتملة منطقية. هل يمكنك تحديد المستخدمين الذين أكملوا </span><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">معظم المهام؟</span></p>
<pre><code><span class="c1"># Map of userId to number of complete TODOs for that user</span>
<span class="n">todos_by_user</span> <span class="o">=</span> <span class="p">{}</span>

<span class="c1"># Increment complete TODOs count for each user.</span>
<span class="k">for</span> <span class="n">todo</span> <span class="ow">in</span> <span class="n">todos</span><span class="p">:</span>
    <span class="k">if</span> <span class="n">todo</span><span class="p">[</span><span class="s2">"completed"</span><span class="p">]:</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Increment the existing user's count.</span>
            <span class="n">todos_by_user</span><span class="p">[</span><span class="n">todo</span><span class="p">[</span><span class="s2">"userId"</span><span class="p">]]</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
            <span class="c1"># This user has not been seen. Set their count to 1.</span>
            <span class="n">todos_by_user</span><span class="p">[</span><span class="n">todo</span><span class="p">[</span><span class="s2">"userId"</span><span class="p">]]</span> <span class="o">=</span> <span class="mi">1</span>

<span class="c1"># Create a sorted list of (userId, num_complete) pairs.</span>
<span class="n">top_users</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">todos_by_user</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> 
                   <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>

<span class="c1"># Get the maximum number of complete TODOs.</span>
<span class="n">max_complete</span> <span class="o">=</span> <span class="n">top_users</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>

<span class="c1"># Create a list of all users who have completed</span>
<span class="c1"># the maximum number of TODOs.</span>
<span class="n">users</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">user</span><span class="p">,</span> <span class="n">num_complete</span> <span class="ow">in</span> <span class="n">top_users</span><span class="p">:</span>
    <span class="k">if</span> <span class="n">num_complete</span> <span class="o">&lt;</span> <span class="n">max_complete</span><span class="p">:</span>
        <span class="k">break</span>
    <span class="n">users</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">user</span><span class="p">))</span>

<span class="n">max_users</span> <span class="o">=</span> <span class="s2">" and "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">users</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">نعم ، نعم ، التنفيذ أفضل ، ولكن النقطة المهمة هي أنه يمكنك الآن معالجة بيانات JSON ككائن Python عادي!</p>
<p>لا أعرف شيئًا عنك ، ولكن عندما أقوم بتشغيل البرنامج النصي بشكل تفاعلي مرة أخرى ، أحصل على النتائج التالية:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="s2">"s"</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">users</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="s2">""</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"user</span><span class="si">{</span><span class="n">s</span><span class="si">}</span> <span class="si">{</span><span class="n">max_users</span><span class="si">}</span><span class="s2"> completed </span><span class="si">{</span><span class="n">max_complete</span><span class="si">}</span><span class="s2"> TODOs"</span><span class="p">)</span>
<span class="go">users 5 and 10 completed 12 TODOs</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">هذا رائع وكل شيء ، لكنك هنا للتعرف على JSON. لمهمتك النهائية ، ستقوم بإنشاء ملف JSON يحتوي على TODOs المكتملة لكل من المستخدمين الذين أكملوا الحد الأقصى لعدد TODO.</p>
<p>كل ما عليك فعله هو تصفية المهام وكتابة القائمة الناتجة إلى ملف. من أجل الأصالة ، يمكنك استدعاء ملف الإخراج filtered_data_file.json. قد توجد طرق يمكنك اتباعها لحل هذا الأمر ، ولكن إليك إحدى الطرق:<br />
</span></p>
<pre><code><span class="c1"># Define a function to filter out completed TODOs </span>
<span class="c1"># of users with max completed TODOS.</span>
<span class="k">def</span> <span class="nf">keep</span><span class="p">(</span><span class="n">todo</span><span class="p">):</span>
    <span class="n">is_complete</span> <span class="o">=</span> <span class="n">todo</span><span class="p">[</span><span class="s2">"completed"</span><span class="p">]</span>
    <span class="n">has_max_count</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">todo</span><span class="p">[</span><span class="s2">"userId"</span><span class="p">])</span> <span class="ow">in</span> <span class="n">users</span>
    <span class="k">return</span> <span class="n">is_complete</span> <span class="ow">and</span> <span class="n">has_max_count</span>

<span class="c1"># Write filtered TODOs to file.</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"filtered_data_file.json"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">data_file</span><span class="p">:</span>
    <span class="n">filtered_todos</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="n">keep</span><span class="p">,</span> <span class="n">todos</span><span class="p">))</span>
    <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">filtered_todos</span><span class="p">,</span> <span class="n">data_file</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">رائع ، لقد تخلصت من جميع البيانات التي لا تحتاجها وحفظت الأشياء الجيدة في ملف جديد تمامًا! قم بتشغيل البرنامج النصي مرة أخرى وتحقق من filtered_data_file.json للتحقق من نجاح كل شيء. سيكون في نفس الدليل مثل scratch.py ​​عند تشغيله.</p>
<p>الآن بعد أن وصلت إلى هذا الحد ، أراهن أنك تشعر ببعض الأشياء الساخنة ، أليس كذلك؟ لا تكن مغرورًا: التواضع فضيلة. أنا أميل إلى الاتفاق معك رغم ذلك. حتى الآن ، كان الإبحار سلسًا ، ولكن قد ترغب في تثبيت الأبواب لهذه المرحلة الأخيرة من الرحلة.</p>
<p><strong><span style="font-size: 20pt">ترميز وفك ترميز كائنات Python المخصصة</span></strong></p>
<p>ماذا يحدث عندما نحاول إجراء تسلسل لفئة Elf من تطبيق Dungeons &amp; Dragons الذي تعمل عليه؟<br />
</span></p>
<pre><code><span class="k">class</span> <span class="nc">Elf</span><span class="p">:</span>
    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">ability_scores</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">level</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ability_scores</span> <span class="o">=</span> <span class="p">{</span>
            <span class="s2">"str"</span><span class="p">:</span> <span class="mi">11</span><span class="p">,</span> <span class="s2">"dex"</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s2">"con"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
            <span class="s2">"int"</span><span class="p">:</span> <span class="mi">16</span><span class="p">,</span> <span class="s2">"wis"</span><span class="p">:</span> <span class="mi">14</span><span class="p">,</span> <span class="s2">"cha"</span><span class="p">:</span> <span class="mi">13</span>
        <span class="p">}</span> <span class="k">if</span> <span class="n">ability_scores</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">ability_scores</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">hp</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">ability_scores</span><span class="p">[</span><span class="s2">"con"</span><span class="p">]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">ليس من المستغرب أن تشتكي Python من أن Elf غير قابل للتسلسل (وهو ما ستعرفه إذا كنت قد حاولت إخبار Elf بخلاف ذلك):<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">elf</span> <span class="o">=</span> <span class="n">Elf</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">elf</span><span class="p">)</span>
<span class="go">TypeError: Object of type 'Elf' is not JSON serializable</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">على الرغم من أن وحدة json يمكنها التعامل مع معظم أنواع Python المضمنة ، إلا أنها لا تفهم كيفية تشفير أنواع البيانات المخصصة افتراضيًا. يبدو الأمر أشبه بمحاولة وضع مشبك مربّع في ثقب دائري — أنت بحاجة إلى منشار أزيز وإشراف أبوي.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>تبسيط هياكل البيانات</strong></p>
<p>الآن ، السؤال هو كيفية التعامل مع هياكل البيانات الأكثر تعقيدًا. حسنًا ، يمكنك محاولة ترميز JSON وفك تشفيره يدويًا ، ولكن هناك حل أكثر ذكاءً قليلاً سيوفر لك بعض العمل. بدلاً من الانتقال مباشرة من نوع البيانات المخصصة إلى JSON ، يمكنك طرح خطوة وسيطة.</p>
<p>كل ما عليك فعله هو تمثيل بياناتك من حيث الأنواع المضمنة التي يفهمها json بالفعل. بشكل أساسي ، تقوم بترجمة الكائن الأكثر تعقيدًا إلى تمثيل أبسط ، والذي تترجمه وحدة json بعد ذلك إلى JSON. إنها مثل خاصية متعدية في الرياضيات: إذا كانت A = B و B = C ، إذن A = C.</p>
<p>لفهم هذا الأمر ، ستحتاج إلى كائن معقد لتلعب به. يمكنك استخدام أي فئة مخصصة تريدها ، لكن لغة Python بها نوع مضمن يسمى معقد لتمثيل الأرقام المعقدة ، ولا يمكن إجراء تسلسل افتراضيًا. لذلك ، من أجل هذه الأمثلة ، سيكون كائنك المعقد كائنًا معقدًا. مرتبك حتى الآن؟<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">z</span> <span class="o">=</span> <span class="mi">3</span> <span class="o">+</span> <span class="mi">8</span><span class="n">j</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">z</span><span class="p">)</span>
<span class="go">&lt;class 'complex'&gt;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">z</span><span class="p">)</span>
<span class="go">TypeError: Object of type 'complex' is not JSON serializable</span>
</code></pre>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">من أين تأتي الأعداد المركبة؟ كما ترى ، عندما يحب عدد حقيقي ورقم وهمي بعضهما البعض كثيرًا ، فإنهما يجمعان معًا لإنتاج رقم يسمى (بشكل مبرر) معقد.<br />
</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">من الأسئلة الجيدة التي يجب أن تطرحها على نفسك عند العمل مع أنواع مخصصة ما هو الحد الأدنى من المعلومات اللازمة لإعادة إنشاء هذا الكائن؟ في حالة الأعداد المركبة ، ما عليك سوى معرفة الأجزاء الحقيقية والخيالية ، وكلاهما يمكنك الوصول إليه كسمات على الكائن المعقد:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">z</span><span class="o">.</span><span class="n">real</span>
<span class="go">3.0</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">z</span><span class="o">.</span><span class="n">imag</span>
<span class="go">8.0</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يعد تمرير نفس الأرقام إلى مُنشئ معقد كافيًا لإرضاء عامل المقارنة __eq__:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">complex</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span> <span class="o">==</span> <span class="n">z</span>
<span class="go">True</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يعد تقسيم أنواع البيانات المخصصة إلى مكوناتها الأساسية أمرًا بالغ الأهمية لكل من عمليات التسلسل وإلغاء التسلسل.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>ترميز أنواع مخصصة</strong></p>
<p>لترجمة كائن مخصص إلى JSON ، كل ما عليك فعله هو توفير وظيفة تشفير للمعامل الافتراضي للطريقة dump (). ستستدعي وحدة json هذه الوظيفة على أي كائنات غير قابلة للتسلسل في الأصل. فيما يلي وظيفة فك تشفير بسيطة يمكنك استخدامها للتدريب:<br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">encode_complex</span><span class="p">(</span><span class="n">z</span><span class="p">):</span>
    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="nb">complex</span><span class="p">):</span>
        <span class="k">return</span> <span class="p">(</span><span class="n">z</span><span class="o">.</span><span class="n">real</span><span class="p">,</span> <span class="n">z</span><span class="o">.</span><span class="n">imag</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">type_name</span> <span class="o">=</span> <span class="n">z</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Object of type '</span><span class="si">{</span><span class="n">type_name</span><span class="si">}</span><span class="s2">' is not JSON serializable"</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لاحظ أنه من المتوقع أن تثير خطأ TypeError إذا لم تحصل على نوع الكائن الذي كنت تتوقعه. بهذه الطريقة ، تتجنب إجراء تسلسل غير مقصود لأي من الجان. الآن يمكنك محاولة ترميز العناصر المعقدة بنفسك!<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="mi">9</span> <span class="o">+</span> <span class="mi">5</span><span class="n">j</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">encode_complex</span><span class="p">)</span>
<span class="go">'[9.0, 5.0]'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">elf</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">encode_complex</span><span class="p">)</span>
<span class="go">TypeError: Object of type 'Elf' is not JSON serializable</span>
</code></pre>
<blockquote><p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">لماذا قمنا بترميز العدد المركب على هيئة tuple؟ سؤال رائع! لم يكن هذا بالتأكيد هو الخيار الوحيد ، كما أنه ليس بالضرورة الخيار الأفضل. في الواقع ، لن يكون هذا تمثيلًا جيدًا جدًا إذا أردت في أي وقت فك تشفير الكائن لاحقًا ، كما سترى قريبًا.<br />
</span></p></blockquote>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">الطريقة الأخرى الشائعة هي تصنيف JSONEncoder القياسي وتجاوز طريقة () الافتراضية الخاصة به:<br />
</span></p>
<pre><code><span class="k">class</span> <span class="nc">ComplexEncoder</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">z</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="nb">complex</span><span class="p">):</span>
            <span class="k">return</span> <span class="p">(</span><span class="n">z</span><span class="o">.</span><span class="n">real</span><span class="p">,</span> <span class="n">z</span><span class="o">.</span><span class="n">imag</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">default</span><span class="p">(</span><span class="n">z</span><span class="p">)</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">بدلاً من رفع TypeError بنفسك ، يمكنك ببساطة السماح للفئة الأساسية بمعالجتها. يمكنك استخدام هذا إما مباشرة في طريقة dump () عبر المعامل cls أو عن طريق إنشاء مثيل من المشفر واستدعاء طريقة encode ():<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">5</span><span class="n">j</span><span class="p">,</span> <span class="bp">cls</span><span class="o">=</span><span class="n">ComplexEncoder</span><span class="p">)</span>
<span class="go">'[2.0, 5.0]'</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">encoder</span> <span class="o">=</span> <span class="n">ComplexEncoder</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">encoder</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="mi">3</span> <span class="o">+</span> <span class="mi">6</span><span class="n">j</span><span class="p">)</span>
<span class="go">'[3.0, 6.0]'</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong>أنواع مخصصة فك التشفير</strong></p>
<p>في حين أن الأجزاء الحقيقية والخيالية للعدد المركب ضرورية للغاية ، إلا أنها في الواقع ليست كافية تمامًا لإعادة إنشاء الكائن. هذا ما يحدث عندما تحاول ترميز رقم معقد باستخدام ComplexEncoder ثم فك ترميز النتيجة:</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="n">complex_json</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="mi">4</span> <span class="o">+</span> <span class="mi">17</span><span class="n">j</span><span class="p">,</span> <span class="bp">cls</span><span class="o">=</span><span class="n">ComplexEncoder</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">complex_json</span><span class="p">)</span>
<span class="go">[4.0, 17.0]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">كل ما تحصل عليه هو قائمة ، وعليك تمرير القيم إلى مُنشئ معقد إذا أردت هذا الكائن المعقد مرة أخرى. أذكر مناقشتنا حول النقل الآني. ما ينقص هو البيانات الوصفية ، أو المعلومات حول نوع البيانات التي تقوم بتشفيرها.</p>
<p>أفترض أن السؤال الذي يجب أن تطرحه على نفسك حقًا هو ما هو الحد الأدنى من المعلومات الضرورية والكافية لإعادة إنشاء هذا الكائن؟</p>
<p>تتوقع وحدة json أن يتم التعبير عن جميع الأنواع المخصصة ككائنات في معيار JSON. للتنوع ، يمكنك إنشاء ملف JSON هذه المرة يسمى complex_data.json وإضافة الكائن التالي الذي يمثل رقمًا معقدًا:<br />
</span></p>
<pre><code><span class="p">{</span>
    <span class="nt">"__complex__"</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
    <span class="nt">"real"</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
    <span class="nt">"imag"</span><span class="p">:</span> <span class="mi">36</span>
<span class="p">}</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">رؤية الشيء الذكي؟ هذا المفتاح &#8220;__complex__&#8221; هو البيانات الوصفية التي تحدثنا عنها للتو. لا يهم حقًا ما هي القيمة المرتبطة. لجعل هذا الاختراق الصغير يعمل ، كل ما عليك فعله هو التحقق من وجود المفتاح:<br />
</span></p>
<pre><code><span class="k">def</span> <span class="nf">decode_complex</span><span class="p">(</span><span class="n">dct</span><span class="p">):</span>
    <span class="k">if</span> <span class="s2">"__complex__"</span> <span class="ow">in</span> <span class="n">dct</span><span class="p">:</span>
        <span class="k">return</span> <span class="nb">complex</span><span class="p">(</span><span class="n">dct</span><span class="p">[</span><span class="s2">"real"</span><span class="p">],</span> <span class="n">dct</span><span class="p">[</span><span class="s2">"imag"</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">dct</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا لم يكن &#8220;__complex__&#8221; موجودًا في القاموس ، يمكنك فقط إرجاع الكائن والسماح لوحدة فك الترميز الافتراضية بالتعامل معه.</p>
<p>في كل مرة تحاول طريقة load () تحليل كائن ما ، يتم منحك الفرصة للتوسط قبل أن تشغل وحدة فك التشفير الافتراضية طريقها مع البيانات. يمكنك القيام بذلك عن طريق تمرير وظيفة فك التشفير الخاصة بك إلى معلمة object_hook.</p>
<p>العب الآن نفس نوع اللعبة كما كان من قبل:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"complex_data.json"</span><span class="p">)</span> <span class="k">as</span> <span class="n">complex_data</span><span class="p">:</span>
<span class="gp">... </span>    <span class="n">data</span> <span class="o">=</span> <span class="n">complex_data</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="gp">... </span>    <span class="n">z</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">object_hook</span><span class="o">=</span><span class="n">decode_complex</span><span class="p">)</span>
<span class="gp">... </span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">z</span><span class="p">)</span>
<span class="go">&lt;class 'complex'&gt;</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">في حين أن object_hook قد يبدو وكأنه المقابل للمعامل الافتراضي لطريقة dump () ، فإن القياس يبدأ وينتهي هناك.</p>
<p>هذا لا يعمل مع كائن واحد فقط. جرب وضع قائمة الأعداد المركبة هذه في complex_data.json وتشغيل البرنامج النصي مرة أخرى:<br />
</span></p>
<pre><code><span class="p">[</span>
  <span class="p">{</span>
    <span class="nt">"__complex__"</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span>
    <span class="nt">"real"</span><span class="p">:</span><span class="mi">42</span><span class="p">,</span>
    <span class="nt">"imag"</span><span class="p">:</span><span class="mi">36</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="nt">"__complex__"</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span>
    <span class="nt">"real"</span><span class="p">:</span><span class="mi">64</span><span class="p">,</span>
    <span class="nt">"imag"</span><span class="p">:</span><span class="mi">11</span>
  <span class="p">}</span>
<span class="p">]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">إذا سارت الأمور على ما يرام ، فستحصل على قائمة بالكائنات المعقدة:<br />
</span></p>
<pre><code><span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"complex_data.json"</span><span class="p">)</span> <span class="k">as</span> <span class="n">complex_data</span><span class="p">:</span>
<span class="gp">... </span>    <span class="n">data</span> <span class="o">=</span> <span class="n">complex_data</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="gp">... </span>    <span class="n">numbers</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">object_hook</span><span class="o">=</span><span class="n">decode_complex</span><span class="p">)</span>
<span class="gp">... </span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">numbers</span>
<span class="go">[(42+36j), (64+11j)]</span>
</code></pre>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يمكنك أيضًا تجربة التصنيف الفرعي JSONDecoder وتجاوز object_hook ، ولكن من الأفضل التمسك بالحل خفيف الوزن كلما أمكن ذلك.<br />
</span></p>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt"><strong><span style="font-size: 20pt">كله تمام!</span></strong></p>
<p>تهانينا ، يمكنك الآن استخدام القوة الجبارة لـ JSON لجميع احتياجات Python الشائنة.</p>
<p>في حين أن الأمثلة التي عملت معها هنا هي بالتأكيد مفتعلة ومفرطة في التبسيط ، فإنها توضح سير عمل يمكنك تطبيقه على مهام أكثر عمومية:<br />
</span></p>
<ol>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">قم باستيراد حزمة json.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">اقرأ البيانات مع load () أو loads ().<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">معالجة البيانات.<br />
</span></li>
<li><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">اكتب البيانات المعدلة مع تفريغ () أو تفريغ ().<br />
</span></li>
</ol>
<p><span class="tlid-translation translation" lang="ar" style="font-size: 14pt">يعتمد ما تفعله ببياناتك بمجرد تحميلها في الذاكرة على حالة الاستخدام الخاصة بك. بشكل عام ، سيكون هدفك هو جمع البيانات من المصدر ، واستخراج المعلومات المفيدة ، وتمرير هذه المعلومات أو الاحتفاظ بسجل لها.</p>
<p>لقد قمت اليوم برحلة: لقد التقطت بعض JSON البرية وقمت بترويضها ، وقمت بالعودة في الوقت المناسب لتناول العشاء! كمكافأة إضافية ، فإن تعلم حزمة json سيجعل تعلم المخلل والتنظيم أمرًا سريعًا.</p>
<p>حظًا سعيدًا في كل مساعيك البايثونية المستقبلية!</span></p>
<p>The post <a rel="nofollow" href="https://arabdars.com/%d8%a7%d9%84%d8%b9%d9%85%d9%84-%d9%85%d8%b9-%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-json-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/">العمل مع بيانات JSON في بايثون</a> appeared first on <a rel="nofollow" href="https://arabdars.com">فيلم تعلم البرمجيات للطالب العربي</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
