Gnu Tips

وبلاگ شخصی وحید معانی

ماژول‌ها و پایتون – بخش دوّم

python modules

post qr-code

تو پست قبلی گفتیم که توصیه اکید شده از ساختار‪ import * ‬برای ایمپورت کردن ماژول‌ها استفاده نکنیم، امّا چرا؟ توی این پست چرایی این توصیه رو بررسی می‌کنیم.

مثال پست قبل رو به خاطر بیارید:

برای مثال اگه یه پروژه‌ی تجارت الکترونیک داشته باشیم، نیاز داریم اطلاعاتی رو داخل پایگاه‌داده ذخیره کنیم. ما می‌تونیم تمام کلاس‌ها و توابع مورد نیاز برای ارتباط با پایگاه‌داده رو داخل یک ماژول (که می‌شه حدس زد اسمش database.py خواهد بود) قرار بدیم. بدین ترتیب بقیه‌ی ماژول‌ها (مثل customers, product و …) برای ارتباط با پایگاه‌داده می‌تونن کلاس‌ و تابع مورد نیاز خودشون رو از داخل ماژول پایگاه‌داده ایمپورت (import) کرده و استفاده کنن.

خب اگر من برای ایمپورت کلاس DataBase از دستور زیر استفاده کنم:

۲سال بعد هم که به کد نگاه کنم متوجه می‌شم که کلاس DataBase از کجا اومده حتی اگه ۴۰۰ خط اونورتر خط

رو داشته باشم می‌تونم سریع به ابتدای فایل و قسمت ایمپورت‌ها برگردم و ببینم که DataBase چی هست و از کجا اومده. و اگه در مورد DataBase نیاز به راهنمایی داشته باشم می‌تونم فایل ماژول اون رو نگاه بکنم و یا ماژول رو توی مفسر تعاملی (interactive interpreter) ایمپورت و راهنمای ‪(help(database.DataBase))‬ اون رو ببینم. امّا اگر از ساختار

استفاده می‌کردم خیلی طول می‌کشید که بفهمم کلاس مورد نظرم از کجا اومده و طبیعتاً نگهداری از کد به یک کابوس تبدیل می‌شد!

گذشته از این، با استفاده از این ساختار همه‌ی توابع و کلاس‌های داخل ماژول وارد کد می‌شن و اصولاً دلیلی نداره کلاس یا تابعی که لازم نداریم تو کد باشن و موقع بازبینی کد توسط خودتون یا دیگران توی جواب دادن به سؤال «این کلاس از کجای کره‌ی زمین اومده؟» به مشکل بر می‌خورید.

منبع:

ترجمه‌ی آزاد از صفحه‌ی ۴۴ کتاب Python 3 Object Oriented Programming نوشته‌ی Dusty Phillips

ماژول‌ها و پایتون

python modules

Post Qrcode

توی پروژه‌های کوچیک می‌شه همه‌ی کلاس‌های مورد نیاز رو در ابتدای یک فایل نوشت و در ادامه‌ی اون بقیه‌ی کد‌های مورد نیاز پروژه رو نوشت. امّا وقتی پروژه پیشرفت می‌کنه و بزرگ‌تر می‌شه استفاده از این روش دردسر سازه برای مثال اگه کلاسی نیاز به ویرایش داشته باشه پیدا کردن اون از بین انبوهی از کد‌ها سخته. اینجا دقیقاً همون‌جایی هست که ماژول وارد می‌شود!

در حقیقت ماژول چیزی غیر از یک فایل پایتون ساده نیست. یعنی یک فایل پایتون یک ماژول هست، دوتا فایل پایتون ۲تا ماژول، و اگر ما ۲تا فایل در یک مسیر داشته باشیم می‌تونیم کلاسی رو از یکی از اونها به دیگری وارد (load) کرده و استفاده کنیم.

برای مثال اگه یه پروژه‌ی تجارت الکترونیک داشته باشیم، نیاز داریم اطلاعاتی رو داخل پایگاه‌داده ذخیره کنیم. ما می‌تونیم تمام کلاس‌ها و توابع مورد نیاز برای ارتباط با پایگاه‌داده رو داخل یک ماژول (که می‌شه حدس زد اسمش database.py خواهد بود) قرار بدیم. بدین ترتیب بقیه‌ی ماژول‌ها (مثل customers, product و …) برای ارتباط با پایگاه‌داده می‌تونن کلاس‌ و تابع مورد نیاز خودشون رو از داخل ماژول پایگاه‌داده ایمپورت (import) کرده و استفاده کنن.

جمله‌ی import برای وارد کردن ماژول، یک کلاس تا تابع خاص از داخل ماژول مورد نظر به کار می‌ره. فرض کردیم که یک ماژول به اسم database.py داریم که یک کلاس به اسم DataBase داره و یک ماژول دیگه به اسم products.py داریم که مسئول مسائل مربوط به محصولات هست و برای اجرای کوئری روی جدول محصولات به کلاس DataBase از ماژول database.py نیاز داره. نحو‌های مختلفی برای ایمپورت ماژول وجود داره:

با این ساختار ایمپورت، همه‌ی کلاس‌ها و توابع موجود در ماژول database با استفاده از ساختار‪ database.<foobar>‬ در دسترس هستن.

با استفاده از ساختار from … import می‌تونیم فقط یک کلاس خاص رو ایمپورت کنیم:

اگر به هر دلیلی ماژول products از قبل کلاسی به اسم DataBase داشته باشه برای جلوگیری از اشتباه می‌شه اسم کلاس رو موقع ایمپورت عوض کرد:

اگر ماژول database یک کلاس دیگر به اسم Query داشته باشه که لازم به ایمپورت اون هم داشته باشم می‌تونیم به جای دستورات:

چندین کلاس رو در یک خط ایمپورت کنیم:

در برخی منابع گفته شده که می‌شه برای ایمپورت همه‌ی کلاس‌ها و توابع یک ماژول از ساختار زیر هم استفاده کرد:

امّا بنا به دلایلی که در پست بعدی بررسی شون می‌کنیم توصیه‌ی اکید شده تا حد امکان از ساختار‪ import * ‬استفاده نکنیم.

 

منبع:

ترجمه‌ی آزاد از صفحات ۴۳ و ۴۴ کتاب Python 3 Object Oriented Programming نوشته‌ی Dusty Phillips

 

توابع بی‌نام lambda در پایتون یا راه‌حل فراخوانی توابع آرگومان‌دار در tkinter

 

post QR code

lambda & tkinter

تابع بی‌نام lambda جزء خصوصیات زبان‌های برنامه‌نویسی تابعی مانند lisp هست که وارد پایتون شده است.

– با کلمه‌ی کلیدی lambda می‌شه توابع کوچیک و بدون نام ایجاد کرد.
– هر جا که نیاز به تابع بود می‌شه از این نوع تابع هم استفاده کرد

 

با کلمه‌ی کلیدی lambda می‌شه توابع کوچیک و بدون نام ایجاد کرد. برای مثال تابع زیر مجموع آرگومان‌هاش رو بر می‌گردونه:

این نوع از توابع مثل همه‌ی توابع نرمال هستن یعنی هر جا که نیاز به تابع بود می‌شه از این‌ها هم استفاده کرد امّا این نوع تابع یه مشکل خیلی خیلی بزرگی داره اونهم اینه که فقط یک عبارت داخل خودش می‌تونه داشته باشه حتی نمی‌شه اون عبارت رو شرطی نوشت! ولی با این حال خیلی کار راه‌انداز هست. در مثال زیر، از تابع بدون نام داخل یک تابع به اسم make_incrementor استفاده کردیم تا حاصل جمع آرگومان تابع اصلی رو با آرگومان خودش برگردونه:

در خط ۴ مقدار ۴۲ داخل آرگومان n قرار می‌گیره و در خط ۵ عدد ۲ داخل متغیر x، که در نهایت موجب می‌شه مقدار ۴۴ در خروجی چاپ بشه. پیشنهاد می‌کنم با مقادیر کاراکتر یا رشته‌ای تست کنیم که بهتر متوجه بشیم داخل این بلوک چی به چیه:

همین‌طور که می‌بینید می‌شه به مزایای استفاده از lambda کاهش تعداد خطوط برنامه رو هم اشاره کرد امّا من یه مورد دیگه رو هم که بنظر خودم مهم و خوب هست رو می‌گم، در برنامه‌هایی که رابط کاربریشون با tkinter نوشته شده برای انجام کار‌های با فشردن دکمه، لازم هست تابعی داشته باشیم و اون رو به دکمه متصل کنیم تا با فشردنش اون تابع اجرا بشه. خب مثه‌ی همه‌ی توابع، توابع ما هم گاهی لازم دارن که آرگومان‌های بگیرن و امّا … نکته اینجاست که tkinter موقع فراخوندن همچین توابعی خطا میده! یعنی اصلاً همچین امکانی وجود نداره! (فراخوانی تابع به همراه آرگومان در دکمه‌ها!!) راه‌کارش استفاده از توابع بی‌نام lambda هست، یعنی تابع lambda رو به عنوان تابع مورد نظر به tkinter معرفی می‌کنیم در حالی که تنها عبارتش تابع مورد نظرمون با تعداد آرگومان‌های مورد نظرش هست. به مثال زیر توجه کنید:

خط ۱۵ همون خطی هست که منظور ما رو می‌روسه. به عبارتی در این حالت  tkinter فقط تابع lambda رو می‌شناسه و نمی‌دونه داخل اون چیه و ما به این صورت می‌تونیم تابع خودمون رو به شکل دلخواه اجرا کنیم. :)

قرار بود پست مینیمال باشه، ولی موقع نوشتن که می‌شه کش میاد. تازه احساس می‌کنم یه چیزایی رو فراموش کردم D:

به خاطر سپردن رمزعبور github توسط git

qrcode

Url Qr Code

سلام این پست به نوعی یه یادآوری و یه یادداشته تا خودم هم این مورد رو فراموش نکنم.

وارد کردن نام کاربری و رمزعبور هنگام پوش کردن ریپو توسط git به github از جمله کارهاییه که حداقل واسه من یکی خیلی سخته مخصوصاً با رمزعبور‌هایی که حفظ کردنش تقریباً محاله و تازه با این حال که github خودش راه‌کاری برای این مشکل تهیه کرده. البته این کار ربطی به خود گیت نداره و به طور دقیقتر اتوماتیک کردن پروسه لاگین در یک ماشین توسط ssh‌ هست.

برای اینکار اوّل از همه لازم داریم که یه ssh key ایجاد کنیم، برای این کار از دستور زیر استفاده می‌کنیم:

به جای عبارت “your_emainl@example.com” آدرس ایمیلی که باهاش اکانت github باز کردین رو بنویسید (فقط به عنوان توضیحات)، در جواب خط دوّم اگر نمی‌خواین فایل id_rsa رو جای دیگه‌ای ذخیره کنید دکمه‌ی Enter رو فشار بدین. و در جواب خطوط ۳ و ۴ هم بدون تایپ چیزی دکمه‌ی Enter رو بزنید. (یه چیزی شبیه نصب برنامه توی ویندوز، Next next next … :))) )

حالا ssh-agent رو اگر در حال اجرا نیست اجرا کرده و کلیدی رو که ساختیم بهش اضافه می‌کنیم:

حالا باید ssh key رو به اکانت github اضافه کنیم، برای این‌کار در قسمت تنظیمات به بخش SSH keys رفته با دکمه‌ی Add SSH key یک کلید جدید اضافه و تمام محتویات فایل ‪~/.ssh/id_rsa.pub‬ رو بهش وارد می‌کنیم.

تمام شد. از این به بعد اگر برای ارتباط با مخزن اگر از ssh استفاده کنید دیگه لازم نیست نام کاربری و رمز‌عبورتون رو وارد کنید.

نکته۱: اگر مخزنی دارید که می‌خواین لینکش رو به ssh تغییر بدین دستور زیر رو با تغییر your_user_name و your_repo با مقادیر مورد نظرتون در شاخه مخزن وارد کنید:

نکته۲: اگر نمی‌دونید از کدوم لینک استفاده کردین دستور زیر رو در مسیر repo بزنید:

و خطی که اوّلش نوشته “remote.origin.url” رو ببینید. خروجی این دستور شامل اطلاعات مفید دیگه‌ای در مورد مخزن هم هست.

نکته۳: اگر از سایت دیگه‌ای به جای github مثل bitbucket استفاده می‌کنید هم مراحل انجام کار همینا خواهند بود به غیر از قسمتی از سایت که باید ssh key رو بهش اضافه کنید. ولی بهتره قبل از انجامش داکیومنت‌های خود سایت و سرویس رو یه نگاهی بندازین.