🧑‍💻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
استفاده نادرست از تابع 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/
📚 آموزش پیشرفته Set در پایتون

ست‌ها در پایتون، مجموعه‌هایی بدون ترتیب و با عناصر منحصربه‌فرد هستن که به دلیل سرعت بالا در عملیات‌های مجموعه‌ای و حذف داده‌های تکراری، یک ابزار کارآمد برای تحلیل داده‌ها محسوب می‌شن.

🔵 یکی از ویژگی‌های پیچیده‌ در setها، توانایی انجام عملیات‌های ریاضی مجموعه‌ای‌، مثل اجتماع، تقاطع، تفاضل و تفاضل متقارن هست.
a = {1, 2, 3, 4}
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}
🔵 ست‌ها در پایتون از Comprehensions پشتیبانی می‌کنن، که با استفاده از شرط‌ها و حلقه‌ها، امکان ساخت setهای پیچیده‌تر فراهم می‌شه.
squared_primes = {x**2 for x in range(10) if is_prime(x)}
print(squared_primes)
🔜 {4, 9, 25, 49}
🔵 متد‌های پیشرفته setها مثل isdisjoint, issubset, و issuperset اجازه می‌دن روابط بین دو set رو بررسی کنیم.
c = {1, 2}
d = {1, 2, 3, 4}
print(c.isdisjoint(b))  # بررسی عدم اشتراک
print(c.issubset(d))    # بررسی زیرمجموعه بودن
print(d.issuperset(c))  # بررسی سوپرمجموعه بودن
🔜 False
True
True
🔵 برای افزودن یا حذف عناصر از ست‌ها، متدهای add, update, و discard کاربرد دارن که امکان مدیریت انعطاف‌پذیر عناصر رو می‌دن.
e = {1, 2, 3}
e.add(4)            # افزودن عنصر
e.update([5, 6, 7]) # افزودن چندین عنصر
e.discard(3)        # حذف عنصر
print(e)
🔜 {1, 2, 4, 5, 6, 7}
🔵 پایتون همچنین اجازه می‌ده ست‌های frozen ایجاد کنیم، که setهایی غیرقابل تغییر هستن و می‌توانن به عنوان کلید در دیکشنری‌ها استفاده شن.
f = frozenset([1, 2, 3])
print(f)
🔜 frozenset({1, 2, 3})
Channel name was changed to «🧑‍💻PythonDev🧑‍💻»
🧑‍💻PythonDev🧑‍💻
✔️ سوال خروجی چیست؟ 1) NameError: name 'e' does not exists 2) 10 3) ZeroDivisionError() چرا؟ 😁
جواب:
تو حالت های دیگه مثلا زمانی که از 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:
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()
فانکشن تموم شده، obj فقط داخل فانکشن ساخته شده بوده باید رفرنسش صفر میشد و از بین میرفت ولی نرفت...
‏گروه هکری که قبلا به اطلاعات تپ‌سی دسترسی پیدا کرده بود، مدعی هک اسنپ‌فود شد و برخی اطلاعات (شامل اطلاعات ۱‌۰۰۰ کاربر و...) را به عنوان دیتای نمونه منتشر کرد.