Faragiri
العربية

كل اللغات

تعلم بايثون لغات البرمجة · أساسيات بايثون، المكتبة القياسية، الحزم والبيئات

عشرة أسطر من المكتبة القياسية تكفي لمجموع مخبز في عمّان، ثم أسبوعان لا يعلّمهما أحد لأنهما ليسا عن اللغة.

3الفروع
3العقد تحتها
3العمق

مثبتة بالفعل

الوحدات الأربع التي بُني منها سكربت سلمى

سطح واحد لا أربع مكتبات: تصل معا، وتُصدَر معا، وكُتبت لتُسلَّم من واحدة إلى أخرى.

المكتبة القياسية
  • pathlibمسار يفتح ويُلحق ويبحث ويتحقق من نفسه
  • csvDictReader، بمفاتيح من سطر العناوين
  • collectionsdefaultdict، فلا حاجة لحارس على مفتاح غائب
  • statisticsmedian وmean، والعدد العشري الصادق حين تكون القيمتان اثنتين
  • jsonالصفوف نفسها، في طريقها إلى مكان آخر
  • sqlite3قاعدة بيانات حقيقية داخل المفسر، بلا خادم
  • pathlibمسار يفتح ويُلحق ويبحث ويتحقق من نفسه
  • csvDictReader، بمفاتيح من سطر العناوين
  • collectionsdefaultdict، فلا حاجة لحارس على مفتاح غائب
  • statisticsmedian وmean، والعدد العشري الصادق حين تكون القيمتان اثنتين
  • jsonالصفوف نفسها، في طريقها إلى مكان آخر
  • sqlite3قاعدة بيانات حقيقية داخل المفسر، بلا خادم

ستة من أصل نحو 200. الشكل لا يقول أيها أفضل، بل إن اللجوء لأي منها من خارج المكتبة يفتح مشكلة ثانية.

سلمى تدير سجل توريد السكر لفرعي مخبز في عمّان داخل جدول بيانات، وتريد مجموعا لكل فرع. عشرة أسطر بلا أي تثبيت، وتطبع:

  • فرع الرابية: 512 كيلوغراما عبر 4 عمليات تسليم، الوسيط 118
  • فرع الجبيهة: 260 كيلوغراما عبر عمليتي تسليم، الوسيط 130.0

السكربت كله أربع استيرادات وحلقة واحدة. csv.DictReader يعطي قاموسا لكل صف، بمفاتيح مأخوذة من سطر العناوين، فيعمل السطر دون عدّ الأعمدة يدويا. Path("سكر.csv").open() يستبدل open() بمسار مبني يدويا، وهو الجدير بالتعلم لأن الكائن نفسه يفتح ويُلحق ويبحث ويتحقق من وجود الملف. defaultdict(list) يُلحق بمفتاح غير موجود بعد، فيزيل حارس السطرين الذي يكتبه كل مبتدئ أولا.

سطر واحد يعمل بصمت: if r["kg"] يتجاوز الخانة الفارغة التي يتركها تسليم لم يُسجَّل، لأن الخلية الفارغة تصل من CSV كسلسلة فارغة لا كقيمة عدم. تفويتها يوقف البرنامج عند تحويل النص الفارغ إلى رقم، وهو أكثر عطل يبدأ به سكربت كهذا.

الناتج فيه تفصيل يستحق النظر. median لقيمتين تُرجع متوسطهما، فيتحول النوع إلى عدد عشري، ولهذا يطبع فرع الجبيهة 130.0 بينما يطبع فرع الرابية 118 صحيحا بلا كسر. لا خطأ هنا، الدالة تخبرك بعدد القراءات التي توفرت لها لا أكثر.

المكتبة قبل أي حزمة، وكلمة لم تستقر بعد

لا شيء مما سبق جاء من حزمة. csv وpathlib وcollections وstatistics تصل مع المفسر نفسه، تُصدَر معه، وكُتبت لتُستخدم معا، وهذا ما يجعل اللجوء إلى تبعية خارجية الخطوة الثانية لا الأولى. التواريخ وJSON وطلبات HTTP والملفات المضغوطة وقاعدة sqlite وحتى عدّاء اختبار كلها موجودة على القاعدة نفسها.

المفردة العربية لهذه اللغة لم تستقر بعد، وهذا يكلّف من يتعلمها هنا مرتين. بعض الدروس تكتب «متغير» وبعضها «متحول» للاسم نفسه، وكلاهما شائع في بلد مختلف. القاعدة التي تُغني عن الاختراع: يُكتب الاسم اللاتيني كما هو عند أول ظهور، متبوعا بمرادفه العربي بين قوسين، ثم يُستخدم أيهما يناسب الجملة، لأن سلمى ستقرأ التوثيق الرسمي بالإنجليزية في اليوم التالي على أي حال.

ما تبقى هو البيئة، وهي معظم الأسبوعين

سكربت سلمى يعمل على جهازها. الفجوة بين هذه الجملة وبين عمله على جهاز زميلها هي مكان الأسبوع الثاني، وليس فيه سطر بايثون واحد. python3 -m venv .venv يجعل للمشروع مفسره وحزمه الخاصة، وهو التحرك الوحيد الذي يمنع تحديث مشروع من كسر مشروع آخر. بدونه كل تثبيت عام وكل مشروع يتنازع على النسخة نفسها.

ملف القفل يسجل النسخ الفعلية ويوضع في المستودع، لأن قائمة أسماء بلا أرقام نسخ تعيد إنتاج أحدث ما يوجد يوم الاستنساخ لا ما عمل عند سلمى. وسطر آخر يخص أي ملف قد يُستورد: if __name__ == "__main__": يحرس كودا يجب ألا يعمل عند الاستيراد. ملف بلا هذا السطر ينفّذ عمله بمجرد أن يستورده شيء آخر، والعطل الناتج محيّر، لأن المستورد قد يكون عدّاء اختبار أو عملية موازية بدأت عاملا جديدا.

الأسبوع الثاني

ما يجب أن يصمد قبل أن يعمل السكربت على جهاز آخر

كل حلقة تحمل الوزن كله، والتي تنكسر ليست أبدا التي درسها أحد.

الحلقة المفتوحة هي حيث يفشل مشروع المبتدئ فعلا، وهي الوحيدة التي لا يكلف إصلاحها شيئا قبل أن تنكسر.

uv وRuff وبايثون 3.14، هذا العام

Python 3.14 هو الإصدار الحالي. uv، من 2024، هو الأداة التي تُثبَّت أولا: مجانية ومفتوحة المصدر، وحلت محل pip وvirtualenv وpyenv، ثلاث أدوات كانت تؤدي عملا واحدا موزعا بينها. تثبّت نسخة المفسر التي يطلبها المشروع وتكتب ملف القفل بنفسها.

Ruff هو المنسّق والمدقق، مجاني أيضا ومن الجهة نفسها، وحل محل flake8 وisort وblack مجتمعة. كلتا الأداتين ثنائي واحد لا يحتاج مفسر بايثون خاصا به ليعمل، وهي المشكلة الدائرية التي كانت تجعل شرح الأدوات القديمة متعبا.

الخطأ: اللجوء إلى حزمة قبل فتح المكتبة

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

القاعدة التي لا تكلف شيئا: قبل تثبيت أي شيء، يُبحث في المكتبة القياسية عنه مرة واحدة. الإجابة تكون لا بما يكفي لإبقاء العادة صادقة، ونعم بما يكفي لتوفير الأسبوع الثاني كله.

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

داخل هذه العقدة، 3

فوق هذه العقدة