نحوه پورت کردن کد پایتون 2 به پایتون 3
خلاصه این طور هست که پایتون 2 اوایل سال 2020 به پایان عمر رسمی خودش رسید و این طور هستش که هیچ گزارش ، رفع اشکال یا تغییر جدیدی تو پایتون 2 ایجاد نشد و دیگر پشتیبانی نمیشه
ولی این راهنما که میخوام بگم بهتون برا ارائه مسیر به پایتون 3 برای کد های شما در نظر گرفته شده که شامل سازگاری با پایتون 3 به عنوان اولین قدم هم میشه
ولی اگه دنبال پوریت یک ماژول افزونه به جای کد پایتون خالص هستین لطفا به انتقال ماژول های پسوند تو پایتون 3 مراجعه کنین
فهرست پستی بایگانی شده با انتقال پایتون ممکه راهنمای مفیدی براتون باشه
خوب بریم سراغ توضیح
برای دستیابی به سازگاری python 2/3 تو یه پایه کد مراحل اصلی به روش زیر هستن
اول اینکه فقط نگران پشتیبانی از پایتون 2.7 باشین بعدش مطمئن بشین که پوشش ازمایشی خیلی خوبه هم داره که coverage.py میتونه کمک کنه
python -m pip install coverage
خلاصه این طور هست که پایتون 2 اوایل سال 2020 به پایان عمر رسمی خودش رسید و این طور هستش که هیچ گزارش ، رفع اشکال یا تغییر جدیدی تو پایتون 2 ایجاد نشد و دیگر پشتیبانی نمیشه
ولی این راهنما که میخوام بگم بهتون برا ارائه مسیر به پایتون 3 برای کد های شما در نظر گرفته شده که شامل سازگاری با پایتون 3 به عنوان اولین قدم هم میشه
ولی اگه دنبال پوریت یک ماژول افزونه به جای کد پایتون خالص هستین لطفا به انتقال ماژول های پسوند تو پایتون 3 مراجعه کنین
فهرست پستی بایگانی شده با انتقال پایتون ممکه راهنمای مفیدی براتون باشه
خوب بریم سراغ توضیح
برای دستیابی به سازگاری python 2/3 تو یه پایه کد مراحل اصلی به روش زیر هستن
اول اینکه فقط نگران پشتیبانی از پایتون 2.7 باشین بعدش مطمئن بشین که پوشش ازمایشی خیلی خوبه هم داره که coverage.py میتونه کمک کنه
python -m pip install coverage
🧑💻PythonDev🧑💻
نحوه پورت کردن کد پایتون 2 به پایتون 3 خلاصه این طور هست که پایتون 2 اوایل سال 2020 به پایان عمر رسمی خودش رسید و این طور هستش که هیچ گزارش ، رفع اشکال یا تغییر جدیدی تو پایتون 2 ایجاد نشد و دیگر پشتیبانی نمیشه ولی این راهنما که میخوام بگم بهتون برا ارائه…
خوب با تفاوت های پایتون 2 و 3 اشنا بشین
اول از همه از futurize (یا Moderinze ) برای به روز رسانی کردن کد هاتون استفاده کنید مثل مثال زیر
python -m pip install future
خوب بعدش از pylint استفاده کنین تا کامل مطمئن بشین که تو پشتیبانی پایتون 3 خود عقب نشینی نمی کنین
python -m pip install pylint
از caniusepython3 استفاده کنین تا متوجه بشین که کدام یکی از وابستگی های شما استفاده از python 3 رو مسدود میکنه
python -m pip install caniusepython3
وقتی که وابستگی هاتون دیگه شما رو مسدود نکرد از یکپارچه سازی مداوم استفاده کنین تا مطمئن بشین که با پایتون 2 و 3 سازگاری هستین (tox میتونه به ازمایش در برابر چندیدن نسخه از پایتون بهتون کمک کنه )
python -m pip install tox
استفاده از بررسی نوع استاتیک اختیاری رو هم در نظر داشته باشین تا مطمئن شوین استفاده از نوع شما تو هر دو پایتون هم 2 و هم 3 کار میکنه ( به عنوان مثال بخوام براتون بگم از mypy واسه بررسی تایپ خودتون تو پایتون 2 و3 استفاده کنین )
python -m pip install mypy
یه نکته که باید بهش توجه کنین استفاده از python -m pip install تضمین میکنه براتون که pip که فراخوانی می کنید همون pip هست که برای پایتون در حال استفاده نصب شده میتونه یه pip تو سطح سیستم هاتون باشه یا تو یه محیط مجازی نصب شده باشه
اول از همه از futurize (یا Moderinze ) برای به روز رسانی کردن کد هاتون استفاده کنید مثل مثال زیر
python -m pip install future
خوب بعدش از pylint استفاده کنین تا کامل مطمئن بشین که تو پشتیبانی پایتون 3 خود عقب نشینی نمی کنین
python -m pip install pylint
از caniusepython3 استفاده کنین تا متوجه بشین که کدام یکی از وابستگی های شما استفاده از python 3 رو مسدود میکنه
python -m pip install caniusepython3
وقتی که وابستگی هاتون دیگه شما رو مسدود نکرد از یکپارچه سازی مداوم استفاده کنین تا مطمئن بشین که با پایتون 2 و 3 سازگاری هستین (tox میتونه به ازمایش در برابر چندیدن نسخه از پایتون بهتون کمک کنه )
python -m pip install tox
استفاده از بررسی نوع استاتیک اختیاری رو هم در نظر داشته باشین تا مطمئن شوین استفاده از نوع شما تو هر دو پایتون هم 2 و هم 3 کار میکنه ( به عنوان مثال بخوام براتون بگم از mypy واسه بررسی تایپ خودتون تو پایتون 2 و3 استفاده کنین )
python -m pip install mypy
یه نکته که باید بهش توجه کنین استفاده از python -m pip install تضمین میکنه براتون که pip که فراخوانی می کنید همون pip هست که برای پایتون در حال استفاده نصب شده میتونه یه pip تو سطح سیستم هاتون باشه یا تو یه محیط مجازی نصب شده باشه
🧑💻PythonDev🧑💻
خوب با تفاوت های پایتون 2 و 3 اشنا بشین اول از همه از futurize (یا Moderinze ) برای به روز رسانی کردن کد هاتون استفاده کنید مثل مثال زیر python -m pip install future خوب بعدش از pylint استفاده کنین تا کامل مطمئن بشین که تو پشتیبانی پایتون 3 خود عقب…
یه سری جزئیات داریم که به شرح زیر می باشند
حتی اگه از یه سری عوامل مثلا وابستگی هایی که کنترلی روی آن ها ندارین همچنان شما رو لزوم به پشتیبانی از پایتون 2 می کنه که این مانع از براشتن یه گام برای گنجاندن پشتیبانی از پایتون 3 نمیشه
اکثر تغییرات مورد نیاز برای پشتیبانی از پایتون 3 منجر به یه کد پاک نر با استفاده از روش های جدید تر حتی تو کد پایتون 2 می شود
نسخه های مختلف تو پایتون 2 در حالت ایده آل کد شما باید با پایتون 2.7 که اخرین نسخه پشتیبانی شده پایتون 2 هست سازگار باشه
البته یه سری از ابزار های که گفتم تو راهنما با پایتون 2.6 کار نمی کنند
در صورت لازم دارم میگم در صورت لازم پروژه شش می تونه بهتون کمک کنه تا پایتون 2.5 و 3 رو به طور همزمان پشتیبانی کنید با این حال که بهاید توجه کنید که تقریبا تموم پروژه های که ذکر شده در این راهنما دردسترس نیستن
اگه بتونید پایتون 2.5 و بالاتر رو نادیده بگیرین تغییرات لازم تو کد هاتون به میزان حداقل خواهد بود تو بدترین حالت تو یه سری موارد باید به جای یک متد از یک تابع استفاده کنید یا به جای استفاده از یک تابع داخلی اید یک تابع رو وارد کنیدAdmin: @Itsec2024
Github:https://github.com/ChiefInformationSecurityOfficer
chanel 1 : https://t.me/pythonlearnme
Chanel 2:
https://t.me/hackerone715
حتی اگه از یه سری عوامل مثلا وابستگی هایی که کنترلی روی آن ها ندارین همچنان شما رو لزوم به پشتیبانی از پایتون 2 می کنه که این مانع از براشتن یه گام برای گنجاندن پشتیبانی از پایتون 3 نمیشه
اکثر تغییرات مورد نیاز برای پشتیبانی از پایتون 3 منجر به یه کد پاک نر با استفاده از روش های جدید تر حتی تو کد پایتون 2 می شود
نسخه های مختلف تو پایتون 2 در حالت ایده آل کد شما باید با پایتون 2.7 که اخرین نسخه پشتیبانی شده پایتون 2 هست سازگار باشه
البته یه سری از ابزار های که گفتم تو راهنما با پایتون 2.6 کار نمی کنند
در صورت لازم دارم میگم در صورت لازم پروژه شش می تونه بهتون کمک کنه تا پایتون 2.5 و 3 رو به طور همزمان پشتیبانی کنید با این حال که بهاید توجه کنید که تقریبا تموم پروژه های که ذکر شده در این راهنما دردسترس نیستن
اگه بتونید پایتون 2.5 و بالاتر رو نادیده بگیرین تغییرات لازم تو کد هاتون به میزان حداقل خواهد بود تو بدترین حالت تو یه سری موارد باید به جای یک متد از یک تابع استفاده کنید یا به جای استفاده از یک تابع داخلی اید یک تابع رو وارد کنیدAdmin: @Itsec2024
Github:https://github.com/ChiefInformationSecurityOfficer
chanel 1 : https://t.me/pythonlearnme
Chanel 2:
https://t.me/hackerone715
GitHub
ChiefInformationSecurityOfficer - Overview
👨💻📚Chief Information Security Officer/Red Hat/Network Administrator Useful Network Sensor/Security Consultant📚👨💻
Penetration Testing Unit Manager - SOC - ChiefInformationSecurityOfficer
Penetration Testing Unit Manager - SOC - ChiefInformationSecurityOfficer
🧑💻PythonDev🧑💻
یه سری جزئیات داریم که به شرح زیر می باشند حتی اگه از یه سری عوامل مثلا وابستگی هایی که کنترلی روی آن ها ندارین همچنان شما رو لزوم به پشتیبانی از پایتون 2 می کنه که این مانع از براشتن یه گام برای گنجاندن پشتیبانی از پایتون 3 نمیشه اکثر تغییرات مورد نیاز…
مطمئن بشین که پشتیبانی از نسخه مناسب رو تو فایل setup.py که دارین مشخص کردین
تو فایل setup.py خودتون باید طبقه بندی کننده trove مناسب رو داشته باشین که مشخص میکنه از کدوم نسخه هایی از پایتون پشتیبانی می کنید و اونجایی که پروژه هاتون از python 3 پشتیبانی نمیکنه حداقل باید زبان برنامه نویسی python 2 فقط مشخص شده باشه تو ایده آل ترین حالت ممکن باید هر نسخه اصلی / فرعی پایتون رو که ازش پشتیبانی میشه رو مشخص کنید
مثل زبان برنامه نویسی python 2.7
سعی کنید پوشش تست خوبی داشته باشین
وقتی که کد خودتون رو از قدیمی ترین نسخه پایتون 2 که میخوایین پشتیبانی میکنه باید مطمئن بشین که مجموعه آزمایشی شما پوشش خوبی داره یه قانون سرانگشتی خوب این هستش که اگر میخواهید به اندازه کافی تو مجموعه آزمایشی خودتون اطمینان داشته باشین که هر گونه نقصی از که بعد از بازنویسی ابزار ها ظاهر میشه اشکالات واقعی تو ابزار ها هستن نه تو کدهای که دارین اگر میخواهید شماره ای رو هدف بگیرین سعی کنید بیش از 80 درصد پوشش داشته باشین ( واگر دریافت بهتر از پوشش 90 درصد براتون سخته احساس بدی اصلا نداشته باشین ) اگر از قبل ابزاری برای اندازه گیری پوشش تست ندارید توصیه میکنم که از coverage.py استفاده کنید
از تفاوت های پایتون 2 و3 آگاه باشین وقتی که کد خودتون رو خیلی خوب آزمایش کردین و آماده هستین تا کدهاتون رو به پایتون 3 انتقال بدین برای اینکه متوجه بشین که کدی که دارین چطور تغییر میکنه و میخواهین تو حین کد نویسی به یه سری موارد توجه کنید باید یاد بگیرین که پایتون 3 چه تغییر های رو تو پایتون 2 ایجاد میکنه
خوب تا همین جا که گفتم میمونه بقیه موارد میره برای روزهای دیگه با دقت به مواردی که گفتم توجه کنید
Admin: @Itsec2024
Github:https://github.com/ChiefInformationSecurityOfficer
chanel 1 : https://t.me/pythonlearnme
Chanel 2:
https://t.me/hackerone715
تو فایل setup.py خودتون باید طبقه بندی کننده trove مناسب رو داشته باشین که مشخص میکنه از کدوم نسخه هایی از پایتون پشتیبانی می کنید و اونجایی که پروژه هاتون از python 3 پشتیبانی نمیکنه حداقل باید زبان برنامه نویسی python 2 فقط مشخص شده باشه تو ایده آل ترین حالت ممکن باید هر نسخه اصلی / فرعی پایتون رو که ازش پشتیبانی میشه رو مشخص کنید
مثل زبان برنامه نویسی python 2.7
سعی کنید پوشش تست خوبی داشته باشین
وقتی که کد خودتون رو از قدیمی ترین نسخه پایتون 2 که میخوایین پشتیبانی میکنه باید مطمئن بشین که مجموعه آزمایشی شما پوشش خوبی داره یه قانون سرانگشتی خوب این هستش که اگر میخواهید به اندازه کافی تو مجموعه آزمایشی خودتون اطمینان داشته باشین که هر گونه نقصی از که بعد از بازنویسی ابزار ها ظاهر میشه اشکالات واقعی تو ابزار ها هستن نه تو کدهای که دارین اگر میخواهید شماره ای رو هدف بگیرین سعی کنید بیش از 80 درصد پوشش داشته باشین ( واگر دریافت بهتر از پوشش 90 درصد براتون سخته احساس بدی اصلا نداشته باشین ) اگر از قبل ابزاری برای اندازه گیری پوشش تست ندارید توصیه میکنم که از coverage.py استفاده کنید
از تفاوت های پایتون 2 و3 آگاه باشین وقتی که کد خودتون رو خیلی خوب آزمایش کردین و آماده هستین تا کدهاتون رو به پایتون 3 انتقال بدین برای اینکه متوجه بشین که کدی که دارین چطور تغییر میکنه و میخواهین تو حین کد نویسی به یه سری موارد توجه کنید باید یاد بگیرین که پایتون 3 چه تغییر های رو تو پایتون 2 ایجاد میکنه
خوب تا همین جا که گفتم میمونه بقیه موارد میره برای روزهای دیگه با دقت به مواردی که گفتم توجه کنید
Admin: @Itsec2024
Github:https://github.com/ChiefInformationSecurityOfficer
chanel 1 : https://t.me/pythonlearnme
Chanel 2:
https://t.me/hackerone715
GitHub
ChiefInformationSecurityOfficer - Overview
👨💻📚Chief Information Security Officer/Red Hat/Network Administrator Useful Network Sensor/Security Consultant📚👨💻
Penetration Testing Unit Manager - SOC - ChiefInformationSecurityOfficer
Penetration Testing Unit Manager - SOC - ChiefInformationSecurityOfficer
این پکیج توی پایتون بتون کمک میکنه که خیلی سریع دیتاستتون رو بررسی کنید و به اصطلاح فنی یک تجربه ی Exploratory Data Analysis هستش..
من خوشم اومد، جالبه.. براتون یه گزارش مفصل و خیلی یوزرفرندی میسازه از داده هاتون، داده های Nan رو مشخص میکنه و خیلی چیزای دیگه!
اگر میخواین شروع کنید، توی Vscode یا Jupyter notebook دستورای توی تصویر رو اجرا کنید..
من خوشم اومد، جالبه.. براتون یه گزارش مفصل و خیلی یوزرفرندی میسازه از داده هاتون، داده های Nan رو مشخص میکنه و خیلی چیزای دیگه!
اگر میخواین شروع کنید، توی Vscode یا Jupyter notebook دستورای توی تصویر رو اجرا کنید..
استفاده از پایتون در پلتفرم های یونیکس
پایتون روی اکثر توزیع ها لینوکس از پیش نصب شده است و به صورت بسته در همه توزیع های دیگر در دسترس است ولی یه سری ویژگی های خاصی هستن که ممکن بخواهیم ازشون استفاده کنیم که تو بسته های توزیع ما موجود نیستن به راحتی هم میتونیم از اخرین نسخه پایتون رو از منبع کامپایل کنیم
در صورتی که پایتون از پیش نصب نشده باشه و تو مخزن ها هم وجود نداشته باشه می تونیم به راحتی بسته های رو برای توزیع خودمون بسازیم به لینک های زیر یه نگاه بندازین
همچنین ببینید
https://www.debian.org/doc/manuals/maint-guide/first.en.html
برای کاربران دبیان
https://en.opensuse.org/Portal:Packaging
برای کاربران OpenSuse
https://docs.fedoraproject.org/en-US/package-maintainers/Packaging_Tutorial_GNU_Hello/
برای کاربران فدورا
https://slackbook.org/html/package-management-making-packages.html
برای کاربران Slackware
پایتون روی اکثر توزیع ها لینوکس از پیش نصب شده است و به صورت بسته در همه توزیع های دیگر در دسترس است ولی یه سری ویژگی های خاصی هستن که ممکن بخواهیم ازشون استفاده کنیم که تو بسته های توزیع ما موجود نیستن به راحتی هم میتونیم از اخرین نسخه پایتون رو از منبع کامپایل کنیم
در صورتی که پایتون از پیش نصب نشده باشه و تو مخزن ها هم وجود نداشته باشه می تونیم به راحتی بسته های رو برای توزیع خودمون بسازیم به لینک های زیر یه نگاه بندازین
همچنین ببینید
https://www.debian.org/doc/manuals/maint-guide/first.en.html
برای کاربران دبیان
https://en.opensuse.org/Portal:Packaging
برای کاربران OpenSuse
https://docs.fedoraproject.org/en-US/package-maintainers/Packaging_Tutorial_GNU_Hello/
برای کاربران فدورا
https://slackbook.org/html/package-management-making-packages.html
برای کاربران Slackware
🧑💻PythonDev🧑💻
چطوری در تلگرام یک قطعه کد برنامه نویسی رو بنویسیم؟ فقط کافیه کدتون رو به روش معمول تایپ کنید ولی اول و آخرش رو سه تا علامتی که در عکس میبینید بزارید خودش به صورت کد نمایش داده میشه. اول کدتون هم اسم زبانش رو بنویسید که مردم بدونند زبانش چیه. برای مثال:…
import os
from pdfminer.high_level import extract_text
def search_keywords_in_pdfs(folder_path, keywords):
try:
# Iterate over each file in the specified folder
for filename in os.listdir(folder_path):
if filename.endswith(".pdf"):
file_path = os.path.join(folder_path, filename)
print(f"\nSearching in file: {file_path}")
# Extract text from the PDF file
text = extract_text(file_path)
# Check if any of the keywords are present in the extracted text
if any(keyword.lower() in text.lower() for keyword in keywords):
print(f"Keyword(s) found in {filename}")
except Exception as e:
print(f"Error: {e}")
# Example usage:
pdf_folder_path = "path/to/your/pdf/folder"
search_keywords = ["python", "programming", "example"]
search_keywords_in_pdfs(pdf_folder_path, search_keywords)
✔️ سوال: best practiceها و ابزارات مورد نیاز برای توسعه یه بسته، لایبرری یا نرمافزار پایتونی چیه؟
ابزارهای زیادی واسه اینکارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم:
Dependency Management System
برای مدیریت وابستگی های یک پروژه بزرگ (یا نسبتا بزرگ)، پیشنهاد میکنم از
همچنین
1. آشنایی و شروع به کار با Poetry
https://realpython.com/dependency-management-python-poetry/
2. جزیات عمیق درباره هر قابلیت و نحوه استفاده
https://python-poetry.org/docs
3. نحوه انتشار یک package پایتونی در PyPI به کمک Poetry
https://johnfraney.ca/blog/create-publish-python-package-poetry/
Linting & Type Checking
برای
اگر عادت دارید کدهای خودتون رو
1. داکیومنت Flake8
https://flake8.pycqa.org/en/latest/user/invocation.html
2. داکیومنت MyPy
https://mypy.readthedocs.io/en/stable/getting_started.html
Code Formatting
برای مرتب و
1. داکیومنت isort
https://pycqa.github.io/isort/
2. داکیومنت Black
https://black.readthedocs.io/en/stable/getting_started.html
3. یک ویدیو از PyCon 2019 درباره Black
https://youtu.be/esZLCuWs_2Y
* این ابزارها همگی داکیومنت ساده و خوانایی دارن و به نظرم بهترین منبع همین داکیومنتهاشون هست.
Testing
دو کتابخونه
1. یک مقاله جامع درباره تست نویسی، انواع آن و روشهای مورد استفاده در پایتون
https://realpython.com/python-testing/
2. ویدیو درباره unittest در پایتون
https://m.youtube.com/watch?v=FxSsnHeWQBY
https://www.youtube.com/watch?v=6tNS--WetLI
* همچنین اگر از
وبسایت pre commit:
https://pre-commit.com/
ابزارهای زیادی واسه اینکارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم:
Dependency Management System
برای مدیریت وابستگی های یک پروژه بزرگ (یا نسبتا بزرگ)، پیشنهاد میکنم از
Poetry
استفاده کنید، چون ابزار بسیار قدرتمندی هست، کار باهاش بسیار راحته (خیلی شبیه به Cargo
در زبان Rust
هست)، کامیونیتی بزرگی داره، به راحتی محیط dev
و prod
رو میتونید مدیریت کنید، مستندات بسیار خوب و روانی داره، در سریع ترین زمان ممکن میتونید پروژه رو در PyPI
منتشر کنید و همچنین پروژههای معروفی از جمله Rich (کتابخونهای که خود pip
هم ازش برای رنگی کردن progress bar
ها استفاده میکنه) از اون استفاده میکنن، که همین نشون میده چقدر کاربردی هست.همچنین
build
و run
هم توسط Poetry
انجام میشه-
منابع آموزشی:1. آشنایی و شروع به کار با Poetry
https://realpython.com/dependency-management-python-poetry/
2. جزیات عمیق درباره هر قابلیت و نحوه استفاده
https://python-poetry.org/docs
3. نحوه انتشار یک package پایتونی در PyPI به کمک Poetry
https://johnfraney.ca/blog/create-publish-python-package-poetry/
Linting & Type Checking
برای
Linting
ابزارهای flake8
و pylint
از معروف ترینها هستن، هر یک رو میتونید شدت سخت گیریشون رو تنظیم کنید، به راحتی همراه با Poetry
تنظیماتشون در یک فایل قرار میگیره و نیاز به نگه داشتن فایلهای متفاوت برای هر کدوم ندارید. به نظرم خود flake8
به تنهایی نیازتون رو برطرف میکنه. اگر از PyCharm
استفاده کنید یک Linter
به صورت Built-in
در اختیارتون میذاره که خوبه و کارتون رو راه میندازه.اگر عادت دارید کدهای خودتون رو
Annotate
کنید و زیاد از Type Hint
ها استفاده میکنید، استفاده از MyPy
به عنوان یک static type checker
به شما کمک میکنه ایرادات موجود در کلاس ها، توابع و ... رو پیدا کنید و بتونید type
های دقیق تری استفاده کنید. همچنین ابزار Pyright
که توسط مایکروسافت توسعه داده میشه، در VSCode
به صورت integrated
با افزونه Pylance
کار میکنه و اگر از VSCode
استفاده میکنید پیشنهاد میکنم حتما افزونه Pylance
رو نصب کنید. PyCharm
هم یک Type Checker
داره ولی هنوز توانمندی Pylance
و MyPy
رو نداره.-
منابع آموزشی:1. داکیومنت Flake8
https://flake8.pycqa.org/en/latest/user/invocation.html
2. داکیومنت MyPy
https://mypy.readthedocs.io/en/stable/getting_started.html
Code Formatting
برای مرتب و
organize
کردن import
ها از isort
استفاده کنید، هم به صورت CLI
در دسترس هست و هم یک API
داره که میتونید در کد پایتون استفاده کنید. یک code formatter
بسیار معروف که در اکثر پروژهها استفاده میشه Black
هست، زیر نظر PSF
(یا Python Software Foundation
) و برنامه نویسای با تجربه و کار کشته ای همچون آقای Łukasz Langa
(ریلیس منیجر پایتون 3.9) توسعه داده میشه، با دیگر ابزار ها مثل isort
سازگار هست، با PEP8
سازگاره و کلی قابلیت مزیت دیگه داره که حقیقتا اینجا جا نمیشن :)-
منابع آموزشی:1. داکیومنت isort
https://pycqa.github.io/isort/
2. داکیومنت Black
https://black.readthedocs.io/en/stable/getting_started.html
3. یک ویدیو از PyCon 2019 درباره Black
https://youtu.be/esZLCuWs_2Y
* این ابزارها همگی داکیومنت ساده و خوانایی دارن و به نظرم بهترین منبع همین داکیومنتهاشون هست.
Testing
دو کتابخونه
Pytest
و unittest
(در stdlib
موجود هست) در تست نویسی پروژه ها استفاده میشن، برای تست کردن پروژه در environment
های متفاوت از ابزار tox
استفاده میشه و باهاش میتونید در نسخه های متفاوتی از پایتون کدتون رو تست کنید.-
منابع آموزشی:1. یک مقاله جامع درباره تست نویسی، انواع آن و روشهای مورد استفاده در پایتون
https://realpython.com/python-testing/
2. ویدیو درباره unittest در پایتون
-
آقای ned batchelder:https://m.youtube.com/watch?v=FxSsnHeWQBY
-
آقای Corey Schafer:https://www.youtube.com/watch?v=6tNS--WetLI
* همچنین اگر از
Git
در پروژه خودتون استفاده میکنید، پیشنهاد میکنم از pre-commit
حتما استفاده کنید و تمام این ابزارهای گفته شده رو automate
کنید تا در هربار commit
کردن، قبل از اینکه commit
انجام بشه، این ابزارها روی کدتون اجرا بشن و اگر اشکالی در کدتون وجود داره پیدا بشه و اون رو برطرف کنید و دوباره commit کنید.وبسایت pre commit:
https://pre-commit.com/
GitHub
GitHub - Textualize/rich: Rich is a Python library for rich text and beautiful formatting in the terminal.
Rich is a Python library for rich text and beautiful formatting in the terminal. - Textualize/rich
📚 آموزش پیشرفته Set در پایتون
ستها در پایتون، مجموعههایی بدون ترتیب و با عناصر منحصربهفرد هستن که به دلیل سرعت بالا در عملیاتهای مجموعهای و حذف دادههای تکراری، یک ابزار کارآمد برای تحلیل دادهها محسوب میشن.
🔵 یکی از ویژگیهای پیچیده در setها، توانایی انجام عملیاتهای ریاضی مجموعهای، مثل اجتماع، تقاطع، تفاضل و تفاضل متقارن هست.
ستها در پایتون، مجموعههایی بدون ترتیب و با عناصر منحصربهفرد هستن که به دلیل سرعت بالا در عملیاتهای مجموعهای و حذف دادههای تکراری، یک ابزار کارآمد برای تحلیل دادهها محسوب میشن.
🔵 یکی از ویژگیهای پیچیده در setها، توانایی انجام عملیاتهای ریاضی مجموعهای، مثل اجتماع، تقاطع، تفاضل و تفاضل متقارن هست.
a = {1, 2, 3, 4}🔵 ستها در پایتون از Comprehensions پشتیبانی میکنن، که با استفاده از شرطها و حلقهها، امکان ساخت setهای پیچیدهتر فراهم میشه.
b = {3, 4, 5, 6}
print(a | b) # اجتماع
print(a & b) # تقاطع
print(a - b) # تفاضل
print(a ^ b) # تفاضل متقارن
🔜 {1, 2, 3, 4, 5, 6}
{3, 4}
{1, 2}
{1, 2, 5, 6}
squared_primes = {x**2 for x in range(10) if is_prime(x)}🔵 متدهای پیشرفته setها مثل isdisjoint, issubset, و issuperset اجازه میدن روابط بین دو set رو بررسی کنیم.
print(squared_primes)
🔜 {4, 9, 25, 49}
c = {1, 2}🔵 برای افزودن یا حذف عناصر از ستها، متدهای add, update, و discard کاربرد دارن که امکان مدیریت انعطافپذیر عناصر رو میدن.
d = {1, 2, 3, 4}
print(c.isdisjoint(b)) # بررسی عدم اشتراک
print(c.issubset(d)) # بررسی زیرمجموعه بودن
print(d.issuperset(c)) # بررسی سوپرمجموعه بودن
🔜 False
True
True
e = {1, 2, 3}🔵 پایتون همچنین اجازه میده ستهای frozen ایجاد کنیم، که setهایی غیرقابل تغییر هستن و میتوانن به عنوان کلید در دیکشنریها استفاده شن.
e.add(4) # افزودن عنصر
e.update([5, 6, 7]) # افزودن چندین عنصر
e.discard(3) # حذف عنصر
print(e)
🔜 {1, 2, 4, 5, 6, 7}
f = frozenset([1, 2, 3])
print(f)
🔜 frozenset({1, 2, 3})
🧑💻PythonDev🧑💻
✔️ سوال خروجی چیست؟ 1) NameError: name 'e' does not exists 2) 10 3) ZeroDivisionError() چرا؟ 😁
جواب:
تو حالت های دیگه مثلا زمانی که از context manager استفاده میکنیم دستور as درواقع همون کار assignment رو انجام میده. مثلا:
ولی اگه این اتفاق توی exception ها هم بیفته مشکل ساز میشه. آبجکت exception داخل خودش یه traceback آبجکتی داره که حاوی اطلاعاتی از exception ما هست. مثلا خود این traceback آبجکت یه رفرنس داره به frame ای که توش exception رخ داده و اون frame هم رفرنس داره به تمام متغیر های لوکال اون scope از جمله؟ e !
e -> traceback -> frame -> e
پس یک circular reference ایجاد میشه:
تو این مثال پایین ما میخوایم از قصد یک رفرنس ایجاد کنیم به e تا زنده بمونه، انگار که همچین مکانیزمی نداشته پایتون. ببینید چه اتفاقی میفته: (فرض کنید obj یک آبجکت خیلی بزرگ هست)
تو حالت های دیگه مثلا زمانی که از context manager استفاده میکنیم دستور as درواقع همون کار assignment رو انجام میده. مثلا:
e = 10
with open("text.txt") as e:
pass
print(e)
اینجا دیگه e اشاره میکنه به فایل باز شده.ولی اگه این اتفاق توی exception ها هم بیفته مشکل ساز میشه. آبجکت exception داخل خودش یه traceback آبجکتی داره که حاوی اطلاعاتی از exception ما هست. مثلا خود این traceback آبجکت یه رفرنس داره به frame ای که توش exception رخ داده و اون frame هم رفرنس داره به تمام متغیر های لوکال اون scope از جمله؟ e !
e -> traceback -> frame -> e
پس یک circular reference ایجاد میشه:
e = 10
try:
raise ZeroDivisionError("hiiiii")
except ZeroDivisionError as e:
print(e is e.__traceback__.tb_frame.f_locals["e"])
در نتیجه پایتون میاد بعد از اینکه بلاک except تموم شد اون اسمی که اشاره میکرد به آبجکت exception یعنی e رو پاک میکنه از namespace.تو این مثال پایین ما میخوایم از قصد یک رفرنس ایجاد کنیم به e تا زنده بمونه، انگار که همچین مکانیزمی نداشته پایتون. ببینید چه اتفاقی میفته: (فرض کنید obj یک آبجکت خیلی بزرگ هست)
class A:فانکشن تموم شده، obj فقط داخل فانکشن ساخته شده بوده باید رفرنسش صفر میشد و از بین میرفت ولی نرفت...
def __del__(self) -> None:
print("object is deleted")
def fn():
obj = A()
exc = None
try:
raise ZeroDivisionError()
except ZeroDivisionError as e:
exc = e
fn()
print("Object is still alive!")
input()
گروه هکری که قبلا به اطلاعات تپسی دسترسی پیدا کرده بود، مدعی هک اسنپفود شد و برخی اطلاعات (شامل اطلاعات ۱۰۰۰ کاربر و...) را به عنوان دیتای نمونه منتشر کرد.
✔️ کلاس zip
ببینید zip یک کلاس هست که میاد به عنوان پارامتر های ورودی خودش،
شاید بگید
خوب حالا این zip چطوری کار میکنه 🤔
این کلاس میاد و از
نکته مهم ❗️
کلاس zip هم مثل filter و map و ... یک
مثال 🧪
پس
ببینید zip یک کلاس هست که میاد به عنوان پارامتر های ورودی خودش،
iterable
(یا iterable
هایی) رو به صورت postional argument
میگیره و یک zip object
به ما برمیگردونه!شاید بگید
iterable
چیه؟ iterable
میشه چیزی که شما توی پایتون بتونی مثلا روش for
بزنی و به اصطلاح iterate
کنی! مثل چی؟ مثل list - str - tuple و ...خوب حالا این zip چطوری کار میکنه 🤔
این کلاس میاد و از
iterable
هایی که بهش داده شده، به تعداد اون Iterable
ها (فرض کنیم n
تا) tuple (هایی) به سایز n
برامون yield
میکنه! حالا اعضای اون tuple که سایزش n
هست (یعنی n
تا عضو داره) چی هستن؟ zip میاد و اولین عضو رو از اولین iterable
و دومین عضو رو از دومین iterable
و همینطوری تا آخر میگیره! این تا کی ادامه داره؟ تا زمانی که اعضای کوتاه ترین iterable
تمام بشه!نکته مهم ❗️
کلاس zip هم مثل filter و map و ... یک
lazy iterator
هست، یعنی چی؟ یعنی جواب رو درجا برای ما محاسبه نمیکنه و هر بار که روش next زده بشه، به ما یک چیزی yield میکنه.مثال 🧪
names = [الان هر بار که روی z ما
"Ali",
"Mohsen",
"Hassan",
]
last_names = [
"Hassanzadeh",
"Mohammadi",
]
z = zip(names, last_names)
next
بزنیم به ما یک tuple به سایز 2 میده (چرا 2 ؟ چون 2 تا iterable
بهش دادیم)>>> next(z)به همین صورت میتونید به لیست، ست و ... این
('Ali', 'Hassanzadeh')
zip object
رو تبدیل کنید:>>> list(z)چرا هر tuple دوتا عضو بیشتر نداره؟ چون همونطور که بالا گفتم تعداد به اندازه کوتاه ترین
[('Ali', 'Hassanzadeh'), ('Mohsen', 'Mohammadi')]
iterable
هست که در اینجا last_names
کوتاه تر هست و فقط 2 عضو داره!پس
signature
کلی کلاس zip به شکل زیر هست (از پایتون 3.10 پارامتر strict
بهش اضافه شده که توضیحش میدم)zip(*iterables, strict=False) —> zip objectخوب ی نکته میمونه، اینکه از پایتون 3.10 به این کلاس یک پارامتری اضافه شده به اسم
strict
! کارش چیه؟ مقدارش به صورت پیشفرض False
هست، ولی زمانی که شما اون رو True کنید، چک میکنه که همه iterable
هایی که بهش دادید آیا طول یکسان دارند یا نه و اگر این شرایط برقرار نبود یک خطای ValueError
به شما میده! مثال:names = [خروجی:
"Ali",
"Mohsen",
"Hassan",
]
last_names = [
"Hassanzadeh",
"Mohammadi",
]
print(list(zip(names, last_names, strict=True)))
ValueError: zip() argument 2 is shorter than argument 1
#builtins✔️ کلاس map
کلاس
این تایپ برای اولین پارامتر یک
اول از همه تایپ مپ درست مانند
کاری که
چند مثال کاربردی 🧪
تبدیل همه اعداد یک لیست به مربع خودشان:
اگر به
کلاس
map
یکی دیگه از تایپهای built-in پایتون است.این تایپ برای اولین پارامتر یک
Callable
دریافت میکنه (مثلا یک تابع یا یک کلاس که داندر ____call____ رو پیادهسازی میکنه) و پارامتر بعدیش تعداد متغیری iterable
هست که بعد از callable
بهش پاس میدیم. signature
عه تابع مپ به این شکل هست:map(callable, *iterables) —> map objectاما
map
چه کاری انجام میده؟ 🤔اول از همه تایپ مپ درست مانند
range
و فیلتر lazy iterator
هست، یعنی فوری نتایج رو محاسبه نمیکنه،کاری که
map
میکنه اینه که میاد دونه دونه از اون iterable
(یا iterable
هایی) که بهش داده شده، به اون callable
پاس میده و نتیجه ای که اون callable
بهش داده (در واقع مقداری که از callable
ما return
شده) رو هر بار که ما next
میزنیم به ما برمیگردونه!چند مثال کاربردی 🧪
تبدیل همه اعداد یک لیست به مربع خودشان:
lst = [2, 4, 6, 8]Output:
print(list(map(lambda x: x ** 2, lst)))
[4, 16, 36, 64]
تبدیل تمام استرینگهای یک لیست به شکل Uppercase خودشان:lst = ["John", "David", "Mike"]Output:
print(list(map(str.upper, lst)))
['JOHN', 'DAVID', 'MIKE']
نکته مهم ❗️اگر به
map
چند تا iterable
میدید، باید حواستون باشه که اون callable
باید به تعداد iterable
ها پارامتر داشته باشه! مثال:x = list(map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6]))Output:
print(x)
[5, 7, 9]
در مثال بالا دو تا iterable
به مپ پاس دادیم پس باید تابعی که به map
میدیم دوتا آرگومان بگیره. حالا map
میاد پارامتر اول (یعنی x) رو از اولین iterable
و دومی رو (یعنی y) از دومین iterable
میگیره! نکته قابل توجه دیگه اینکه، این فرایند توی تابع (یعنی جمع x و y) به تعداد اعضای کوتاه ترین iterable
انجام میشه! یعنی اگر یکی از iterable
ها 2 عضو داشت و بقیه 5 عضو، فقط روی 2 عضو اول هر iterable
مپ کار انجام میده! مثال:x = list(map(lambda x, y: x + y, [2, 3], [4, 5, 6, 4]))Output:
print(x)
[6, 8]
#builtins