🧑‍💻PythonDev🧑‍💻
365 subscribers
86 photos
3 videos
15 files
78 links
Python tips and tricks
The Good, Bad and the Ugly

📚توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

👨‍💻این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی این چند سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)👨‍💻


@Mtio975
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Duck typing, Dynamic Protocol

رو میشه با هم نشون داد؛ ی جمله معروف داره که همه بلد هستند اما خیلی ها مفهومش رو نمی‌دونند

Duck typing :If it looks like a duck and quacks like a duck, it’s a duck.

چیزی که این جمله سعی داره بگه اینه که؛
برای ما مهم نیست object کدوم کلاس هستی اگر این متدها و فانکشنالیتی ها رو داری عضوی از ما هستی.
ما برنامه نویس‌ها همیشه Duck type mode هستیم بصورت پیشفرض؛ برای ما فرقی نمی‌کنه طرف رشته کامپیوتر خونده یا حقوق و حسابداری و ... یا اصلا درس نخونده
برای ما مهم هست که طرف توانایی کد زدن داشته باشه و اگر بتونه این کار رو به خوبی انجام بده بهش لقب برنامه نویس میدیم.

پس توی Duck typing اولویت متدها هستند و نه خروجی isinstance
🧑‍💻PythonDev🧑‍💻
Duck typing, Dynamic Protocol رو میشه با هم نشون داد؛ ی جمله معروف داره که همه بلد هستند اما خیلی ها مفهومش رو نمی‌دونند Duck typing :If it looks like a duck and quacks like a duck, it’s a duck. چیزی که این جمله سعی داره بگه اینه که؛ برای ما مهم نیست object…
Dynamic Protocol 


هم از همین مفهموم استفاده می‌کنه؛ اگر یادتون باشه قبلا راجب پروتوکل مربوط به Sequence صحبت کردیم و گفتیم که اگر یک class متدهای
__len__, __getitem__

رو داشته باشه می‌تونیم بعنوان Sequence Protocol رو رعایت می‌کنه و پایتون می‌تونه مثل Sequence باهاش رفتار کنه و برخی از فانکشنالیتی‌هایی که پیاده سازی هم نکردیم رو بهش بده.

Dynamic Protocol 

ی قدم جلوتر میره و میگه اگر قرار نیست len اون آبجکت رو بگیری پس نیازی نیست توی اون کلاس حتی __len__ رو پیاده سازی کنی و صرف وجود __getitem__ من بهت یک سری ویژگی‌های Sequence رو میدم؛ ویژگی‌هایی که فقط به __getitem__ نیاز داره و نه چیز دیگه.

توی مثال تصویر قبل؛ من هیچوقت __iter__ رو پیاده‌سازی نکردم اما می‌تونم روی dp از for loop استفاده کنم؛ به لطف
Duck typing, Dynamic Protocol
پایتون از __getitem__ استفاده می‌کنه و با شروع از اندیس 0 می‌تونه کار __iter__ رو انجام بده و for loop بهمون خروجی خواهد داد.
برای in هم موضوع همین هست؛ توی کد قبلی من هیچوقت __contain__ رو پیاده‌سازی نکردم اما
9 in dp
خروجی میده (اینبار هم پایتون از __getitem__ بعنوان fallback برای __contain__ استفاده می‌کنه)

بحثی که پیش میاد اینه که؛ آیا این موضوع اتفاق خوبی هست ؟
نه همیشه؛ خیلی وقت‌ها میشه نسخه optimize شده تری رو نوشت مثلاْ توی کد قبلی اگر من لیست رو بصورت sort قرار باشه داشته باشم همیشه می‌تونم بجای __contain__ که خود پایتون بهم میده و linear search هست که مرتبه زمانی O(n) داره از Binary Search استفاده کنم و مرتبه زمانی رو تا O(log n) کاهش بدم.
اما تا وقتی نیازی به بهبود ندارم؛ هیچوقت __contain__ یا ... رو خودم پیاده‌سازی نمی‌کنم و از آنچه که پایتون بهم ارائه میده استفاده می‌کنم (اینطوری نه نیاز به تست هست؛ نه باگ ازش در میاد و کد تمیزتری هم خواهم داشت)
استفاده نادرست از تابع super().init(root) در کلاس MyownDataset است. برای حل این مشکل باید نام تابع init را به صورت صحیح و با حروف بزرگ درست کنید. تابع init دستوری است که هنگام ایجاد شیء از یک کلاس فراخوانی می‌شود و باید به صورت init(self, root) تعریف شود.
📚یک ابزار مفید که هم مطالب سر کلاس رو برات جزوه میکنه هم مطالب مهم رو برات bold میکنه و براتون فلش کارت درست میکنه.

دیگه چی ازین بهتر!
👇🏻👇🏻👇🏻
Study Fetch | Revolutionize Your Learning With Ai
https://www.studyfetch.com/

=..=..=..=..=..=..=..=..=..=..=..=..=..=..=..=..=..=
نحوه پورت کردن کد پایتون 2 به پایتون 3

خلاصه این طور هست که پایتون 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 تو سطح سیستم هاتون باشه یا تو یه محیط مجازی نصب شده باشه
🧑‍💻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
🧑‍💻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
این پکیج توی پایتون بتون کمک میکنه که خیلی سریع دیتاستتون رو بررسی کنید و به اصطلاح فنی  یک تجربه ی  Exploratory Data Analysis هستش..

من خوشم اومد، جالبه.. براتون یه گزارش مفصل و خیلی یوزرفرندی میسازه از داده هاتون، داده های 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
در FreeBSD و OpenBSD
چطوری در تلگرام یک قطعه کد برنامه نویسی رو بنویسیم؟ 

فقط کافیه کدتون رو به روش معمول تایپ کنید ولی اول و آخرش رو سه تا علامتی که در عکس میبینید بزارید خودش به صورت کد نمایش داده میشه. اول کدتون هم اسم زبانش رو بنویسید که مردم بدونند زبانش چیه. برای مثال:



a=5
b=9
print(a+b)
🧑‍💻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)
✔️ سوال

خروجی چیست؟
1) NameError: name 'e' does not exists
2) 10
3) ZeroDivisionError()

چرا؟ 😁
✔️ سوال: best practice‌ها و ابزارات مورد نیاز برای توسعه یه بسته، لایبرری یا نرم‌افزار پایتونی چیه؟

ابزارهای زیادی واسه این‌کارا وجود داره که بر اساس تجربه و چیزی که از 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/