🔺ویژگی add_note to Exceptions
تا حالا شده بخواید توی حالتی که خطا رو مدیریت میکنید متن کمکی اضافه کنید؟
❗️برای اینکار باید کمی کثیف کاری کنید و خطایی با پیغام مناسب برای خودتون بسازید اما حالا با ویژگی جدید پایتون 3.11 میتونید به هر خطایی که تولید میشه بدون هیچ کد اضافهای و فقط با یک متد یه متن مناسب اضافه کنید!
سورس کد
این خصوصیت میتونه توی کار با کتابخانههایی مثل hypothesis که برای تست نویسی خصوصیتی کاربرد دارن مفید باشه!
#py311
🔎 @py4ds
تا حالا شده بخواید توی حالتی که خطا رو مدیریت میکنید متن کمکی اضافه کنید؟
❗️برای اینکار باید کمی کثیف کاری کنید و خطایی با پیغام مناسب برای خودتون بسازید اما حالا با ویژگی جدید پایتون 3.11 میتونید به هر خطایی که تولید میشه بدون هیچ کد اضافهای و فقط با یک متد یه متن مناسب اضافه کنید!
سورس کد
این خصوصیت میتونه توی کار با کتابخانههایی مثل hypothesis که برای تست نویسی خصوصیتی کاربرد دارن مفید باشه!
#py311
🔎 @py4ds
👏1
Python for Data Science
🔺 ویژگی مهم بعدی برای کسانی که برنامه نویسی async انجام میدن خیلی به درد بخور هست. 👉 Exception Group 💡اگر کدی داشته باشید که به صورت async اجرا میشه و باید خطاهای به وجود اومده توی همه یا برخی از تردها رو مدیریت کنید این ویژگی خیلی بهتون کمک میکنه! 📌با این…
🔺مفهوم packing, unpacking توی پایتون از مدتها قبل با استفاده از
🔹ابتکار جالب این بنیاد در بکارگیری این علامت برای Exception Group ها به نظرم خیلی هوشمندانه هست!
👨🏻🏫به نظرم در آموزش پایتون یکی از مهمترین چیزهایی که باید به خوبی رووش تاکید بشه همین علامت و کاربردهای مختلف اون هست!
🔎 @py4ds
*
شناخته شده بود!🔹ابتکار جالب این بنیاد در بکارگیری این علامت برای Exception Group ها به نظرم خیلی هوشمندانه هست!
👨🏻🏫به نظرم در آموزش پایتون یکی از مهمترین چیزهایی که باید به خوبی رووش تاکید بشه همین علامت و کاربردهای مختلف اون هست!
🔎 @py4ds
👏1
🔺 خوانده فایلهای TOML
پایتون با PEP 518 در سال ۲۰۱۶ به معرفی فایل pyproject.toml پرداخت این فایل حاوی اطلاعات اضافی در مورد محیط اجرای کد و در واقع یک پیکربندی جداگانه(نسبت به setuptools) برای سیستم ساخت بود. این فایل ساختاری شبیه فایلهای کانفیگ داره!
🔺شما توی این فایل میتونید تنظیمات دلخواهی رو برای کتابخانههایی مثل black, mypy, isort, pylint و غیره انجام بدید و این کار کیفیت کد توسعه یافته رو خیلی زیاد میکنه
🍿 حالا پایتون در نسخه 3.11 با معرفی کتابخونه tomllib به شما این امکان رو میده که هر فایلی با این ساختار رو بخونید و ایجاد کنید!
سورس کد
#py311
🔎 @py4ds
پایتون با PEP 518 در سال ۲۰۱۶ به معرفی فایل pyproject.toml پرداخت این فایل حاوی اطلاعات اضافی در مورد محیط اجرای کد و در واقع یک پیکربندی جداگانه(نسبت به setuptools) برای سیستم ساخت بود. این فایل ساختاری شبیه فایلهای کانفیگ داره!
🔺شما توی این فایل میتونید تنظیمات دلخواهی رو برای کتابخانههایی مثل black, mypy, isort, pylint و غیره انجام بدید و این کار کیفیت کد توسعه یافته رو خیلی زیاد میکنه
🍿 حالا پایتون در نسخه 3.11 با معرفی کتابخونه tomllib به شما این امکان رو میده که هر فایلی با این ساختار رو بخونید و ایجاد کنید!
سورس کد
#py311
🔎 @py4ds
👏1
Python for Data Science
🔺 خوانده فایلهای TOML پایتون با PEP 518 در سال ۲۰۱۶ به معرفی فایل pyproject.toml پرداخت این فایل حاوی اطلاعات اضافی در مورد محیط اجرای کد و در واقع یک پیکربندی جداگانه(نسبت به setuptools) برای سیستم ساخت بود. این فایل ساختاری شبیه فایلهای کانفیگ داره! 🔺شما…
🔹 توی سورس کد بالا یه اشاره کوچیک هم به متد بهبودیافته datetime کردم که حالا در پایتون 3.11 میتونه فرمتهای مختلف ISO8601 رو تبدیل به آبجکت پایتونی زمان کنه!😅
🔎 @py4ds
🔎 @py4ds
👏1
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
یک لیستی میخوایم داشته باشیم که تعداد مشخصی داده بگیره و اگر اضافه تر بشه از اولش حذف کنه اینطوری اگر داده ای رو اضافه کنیم به اندازه طول لیستمون میمونه و بعدش حذف میشه
راه حل ساخت چنین لیستی چی هستش ؟یک راهکار ساده اینه که با اینسرت به ایندکس صفرم اضافه کنیم و بعد دوباره محتوای لیست رو بهش بدیم به همون تعداد که میخوایم
def list_insert(item, limited_list):
limited_list.insert(0, item)
return limited_list[:10]
ids = []
ids = list_insert(1, ids)
اما یک راهکار بهتر هم هست😚
import collections
ids = collections.deque(maxlen=10)
به همین راحتی. الان ids یک لیسته که میتونید توش دیتا اضافه کنید و مثلا اگر اعداد یک تا ده اضافه کنید وقتی ۱۱ اضافه میکنید یک پاک میش
🖥 @SEYED_BAX
راه حل ساخت چنین لیستی چی هستش ؟یک راهکار ساده اینه که با اینسرت به ایندکس صفرم اضافه کنیم و بعد دوباره محتوای لیست رو بهش بدیم به همون تعداد که میخوایم
def list_insert(item, limited_list):
limited_list.insert(0, item)
return limited_list[:10]
ids = []
ids = list_insert(1, ids)
اما یک راهکار بهتر هم هست
import collections
ids = collections.deque(maxlen=10)
به همین راحتی. الان ids یک لیسته که میتونید توش دیتا اضافه کنید و مثلا اگر اعداد یک تا ده اضافه کنید وقتی ۱۱ اضافه میکنید یک پاک میش
🖥 @SEYED_BAX
Please open Telegram to view this post
VIEW IN TELEGRAM
سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی
یک لیستی میخوایم داشته باشیم که تعداد مشخصی داده بگیره و اگر اضافه تر بشه از اولش حذف کنه اینطوری اگر داده ای رو اضافه کنیم به اندازه طول لیستمون میمونه و بعدش حذف میشه راه حل ساخت چنین لیستی چی هستش ؟یک راهکار ساده اینه که با اینسرت به ایندکس صفرم اضافه…
در رابطه با deque یه کد نمونه براتون میذارم
Python for Data Science
در رابطه با deque یه کد نمونه براتون میذارم
فرض کنید میخواید یه مجموعهای از آیتمها رو توی خروجی چاپ کنید
این آیتمها اینقدر مهم نیست که همش نیاز باشه چاپ بشه اینقدر هم بی اهمیت نیست که در حد یک خط سریع چاپ کنیم و پاکش کنیم
راه حل چیه؟
بیایم و n آیتمها آخر رو توی خروجی چاپ کنیم برای اینکار باید بتونیم خطوط قبلی رو هم پاک کنیم
کد زیر نمونهای از استفاده از deque برای نگهداری خطوط چاپ شدهی قبل (تا nخط) هست
سورس کد
#آموزش
🔎 @py4ds
این آیتمها اینقدر مهم نیست که همش نیاز باشه چاپ بشه اینقدر هم بی اهمیت نیست که در حد یک خط سریع چاپ کنیم و پاکش کنیم
راه حل چیه؟
بیایم و n آیتمها آخر رو توی خروجی چاپ کنیم برای اینکار باید بتونیم خطوط قبلی رو هم پاک کنیم
کد زیر نمونهای از استفاده از deque برای نگهداری خطوط چاپ شدهی قبل (تا nخط) هست
from collections import deque
from random import choices, randint
from string import ascii_letters
from sys import stdout
from time import sleep
deq = deque(maxlen=5)
delay = 0.15
sep = " "
def get_random_items(num):
n = randint(2, 10)
return [num, *choices(ascii_letters, k=n)]
args_list = [get_random_items(i) for i in range(50)]
for args in args_list:
# clear last print lines
for _ in range(len(deq)):
stdout.write("\x1b[1A\x1b[2K") # move up cursor and delete whole line
# prepare new lines
deq.append(
sep.join(map(lambda x: str(x), args))
) # remove first element and append new to the end
# re-print the lines
stdout.write("\n".join(deq) + "\n")
sleep(delay)
سورس کد
#آموزش
🔎 @py4ds
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
🔺 یه نسخه اولیه از کتابخونه komet رو توی pypi منتشر کردم.
این کتابخونه رو میتونید با دستور زیر نصب کنید
pip install komet
نمونه کد زیر نشون میده که این کتابخونه چطوری کار میکنه
from komet import TailPrint
tprint = TailPrint(max_count=10, delay=0.15)
tprint("#### Step 1 ####")
for i in range(50):
tprint(i, end=" * " if i % 2 == 0 else "\n")
tprint("#### Step 2 ####")
tp2 = TailPrint(5) # override by previous instance (singleton)
for i in range(200, 250):
tp2(i)
این کتابخونه که بر اساس کدی که دیروز منتشر کرده بودم با استفاده از یک deque و الگوی Singleton یه آبجکت بهتون میده که میتونید به جای پرینت معمولی ازش استفاده کنید
این کتابخونه هیچ پیشنیازی نداره و به صورت خالص با خود پایتون نوشته شده همچنین سعی کردم از دستورات جدیدتر استفاده نکنم که با پایتونهای +۳.۷ هم سازگار باشه
پ.ن: روی ۳.۶ تست نکردم ولی احتمالا مشکلی نداشته باشه
🔎 @py4ds
این کتابخونه رو میتونید با دستور زیر نصب کنید
pip install komet
نمونه کد زیر نشون میده که این کتابخونه چطوری کار میکنه
from komet import TailPrint
tprint = TailPrint(max_count=10, delay=0.15)
tprint("#### Step 1 ####")
for i in range(50):
tprint(i, end=" * " if i % 2 == 0 else "\n")
tprint("#### Step 2 ####")
tp2 = TailPrint(5) # override by previous instance (singleton)
for i in range(200, 250):
tp2(i)
این کتابخونه که بر اساس کدی که دیروز منتشر کرده بودم با استفاده از یک deque و الگوی Singleton یه آبجکت بهتون میده که میتونید به جای پرینت معمولی ازش استفاده کنید
این کتابخونه هیچ پیشنیازی نداره و به صورت خالص با خود پایتون نوشته شده همچنین سعی کردم از دستورات جدیدتر استفاده نکنم که با پایتونهای +۳.۷ هم سازگار باشه
پ.ن: روی ۳.۶ تست نکردم ولی احتمالا مشکلی نداشته باشه
🔎 @py4ds
This media is not supported in your browser
VIEW IN TELEGRAM
👨🏻💻فیلم با کیفیت از اجرای کد
🔎 @py4ds
🔎 @py4ds
📗 #معرفی_کتاب
Grokking Algorithms
Aditya Bhargava
🔺این کتاب با زبانی بسیار شیوا الگوریتمهای عمومی در حل مسائل مختلف (مثل جستجوی دودویی، مرتب سازی و غیره) رو توضیح داده
🔺این کتاب به دوستانی که قصد مطالعه کتاب Data Structures & Algorithms in Python رو دارن توصیه میشه.
🔎 @py4ds
Grokking Algorithms
Aditya Bhargava
🔺این کتاب با زبانی بسیار شیوا الگوریتمهای عمومی در حل مسائل مختلف (مثل جستجوی دودویی، مرتب سازی و غیره) رو توضیح داده
🔺این کتاب به دوستانی که قصد مطالعه کتاب Data Structures & Algorithms in Python رو دارن توصیه میشه.
🔎 @py4ds
🔺چند روزی هست که با کمک یکی از دوستان یه پروژه جالب شروع کردم.
🔹توی این پروژه میتونید از پوشه یک پکیج از قبل آماده شده، دو پکیج whl که یکی به صورت obfuscate شده (اصلی) و یکی فقط شامل interfaces ساختارها هست بسازید.
👈پروژه اینجاست هنوز README اش آماده نشده ولی میتونید فعلا یه نگاه بهش بندازید.
در روزهای آینده بیشتر در موردش صحبت میکنم.
🔎 @py4ds
🔹توی این پروژه میتونید از پوشه یک پکیج از قبل آماده شده، دو پکیج whl که یکی به صورت obfuscate شده (اصلی) و یکی فقط شامل interfaces ساختارها هست بسازید.
👈پروژه اینجاست هنوز README اش آماده نشده ولی میتونید فعلا یه نگاه بهش بندازید.
در روزهای آینده بیشتر در موردش صحبت میکنم.
🔎 @py4ds
🔺 یک ویژگی جدید در پایتون ۳.۱۱
بعضی وقتا نیاز هست برای انجام یک کار فرعی، پوشهی کار فعلی رو تغییر بدیم به یه آدرس دیگه و کارمون رو انجام بدیم و دوباره برگردیم به پوشه اصلی.
🔹یه راه ساده اینه که از روش زیر استفاده کنیم
🔸توی پایتون 3.11 یه context manager برای این کار به صورت زیر اضافه شده:
به همین راحتی و تمیزی!
#py311
🔎 @py4ds
بعضی وقتا نیاز هست برای انجام یک کار فرعی، پوشهی کار فعلی رو تغییر بدیم به یه آدرس دیگه و کارمون رو انجام بدیم و دوباره برگردیم به پوشه اصلی.
🔹یه راه ساده اینه که از روش زیر استفاده کنیم
import os
from contexlib import contextmanager
@contextmanager
def enter_dir(path):
old_path = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(old_path)
🔸توی پایتون 3.11 یه context manager برای این کار به صورت زیر اضافه شده:
import os
from contextlib import chdir
print('before:', os.getcwd())
# before: /home/py4ds
with chdir('/'):
print('inside:', os.getcwd())
# inside: /
print('after:', os.getcwd())
# after: /home/py4ds
به همین راحتی و تمیزی!
#py311
🔎 @py4ds
👍4
🔺 حذف استرینگ خالی در split
😊 Fast and clean
🔎 @py4ds
>>> s = 'abc,'
>>> s.split(',')
['abc', '']
>>> [item for item in s.split(',') if item]
['abc']
😊 Fast and clean
🔎 @py4ds
👍2
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
>>> s = 'سایر رسانه ها,'
>>> s.split(',')
['سایر رسانه ها', '']
>>> list(filter(None, s.split(',')))
['سایر رسانه ها']
Please open Telegram to view this post
VIEW IN TELEGRAM
سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی
🎯یه مقایسه روی این دوتا روش داشته باشیم
پست ریپلای و این پست
🔺به طور کلی استفاده از تابع فیلتر به همراه lambda میتونه سرعت رو بیاره پایین
اما اینجا خبری از lambda نیست پس نتیجه هم احتمالا کند نیست
یه بررسی اجمالی داشتم روی حالتهای مختلف:
حالتی که خودم توی کانال گذاشتم هم سریع هست هم تمیز اما حالتی که دوستمون نوشتن برای مواردی که رشته طولانی و تعداد splitها زیاد بشه میتونه کمی(شاید حدود کمتر از ۲-۳ درصد) سریعتر باشه
🔺 توجه کنید که این یه حالت خاص هست و خود پایتون هم توصیه میکنه که اگر نیاز به لیست هست بهتره از list comprehension (روش اول) استفاده بشه
❗️به طور کلی بهتره اگر نیاز به لیست ندارید کد رو طوری بنویسید که با جنریتور(خروجی مستقیم filter,map,...) کار کنه؛ اینطوری حالت ایدهآل هست!
🔎 @py4ds
پست ریپلای و این پست
🔺به طور کلی استفاده از تابع فیلتر به همراه lambda میتونه سرعت رو بیاره پایین
اما اینجا خبری از lambda نیست پس نتیجه هم احتمالا کند نیست
یه بررسی اجمالی داشتم روی حالتهای مختلف:
حالتی که خودم توی کانال گذاشتم هم سریع هست هم تمیز اما حالتی که دوستمون نوشتن برای مواردی که رشته طولانی و تعداد splitها زیاد بشه میتونه کمی(شاید حدود کمتر از ۲-۳ درصد) سریعتر باشه
🔺 توجه کنید که این یه حالت خاص هست و خود پایتون هم توصیه میکنه که اگر نیاز به لیست هست بهتره از list comprehension (روش اول) استفاده بشه
❗️به طور کلی بهتره اگر نیاز به لیست ندارید کد رو طوری بنویسید که با جنریتور(خروجی مستقیم filter,map,...) کار کنه؛ اینطوری حالت ایدهآل هست!
🔎 @py4ds
Telegram
Python for Data Science
🔺 حذف استرینگ خالی در split
>>> s = 'abc,'
>>> s.split(',')
['abc', '']
>>> [item for item in s.split(',') if item]
['abc']
😊 Fast and clean
🔎 @py4ds
>>> s = 'abc,'
>>> s.split(',')
['abc', '']
>>> [item for item in s.split(',') if item]
['abc']
😊 Fast and clean
🔎 @py4ds
🔥4
Python for Data Science
🔺چند روزی هست که با کمک یکی از دوستان یه پروژه جالب شروع کردم. 🔹توی این پروژه میتونید از پوشه یک پکیج از قبل آماده شده، دو پکیج whl که یکی به صورت obfuscate شده (اصلی) و یکی فقط شامل interfaces ساختارها هست بسازید. 👈پروژه اینجاست هنوز README اش آماده نشده…
🔺قبلا در این مورد صحبت کرده بودم
اما الان میخوام بیشتر توضیح بدم
‼️یکی از قابلیتهای پایتون این هست که شما میتونید کدهایی با سورس بسته تولید کنید اصطلاحا به این مدل کدها کدهای آبفاسکیت یا مبهم شده میگن
❗️کدی که آبفاسکیت میشه میتونه بعد از یک مدت زمان خاص اکسپایر بشه و دیگه اجرا نشه یا مثلا فقط از طریق یک ماژول خاص(استارتر) اجرا بشه و ماژولهای دیگهی اون به تنهایی اجرا نشن
❓چرا کد نیاز به کد آبفاسکیت داریم؟ دلایل زیادی ممکنه وجود داشته باشه از جمله توسعه دانشهایی که برای یک شرکت درآمدزایی داره و با عمومی شدنش ممکنه به درآمد شرکت ضربه زیادی وارد بشه. دلیل دیگه اینه که ممکنه ویرایش یک کد باعث اختلال توی الگوریتم از پیش تعیین شده بشه پس برای اینکه از تغییرات جلوگیری بشه اونو آبفاسکیت میکنن
در اینکه آیا این کار مفید هست یا نه میشه بحث کرد. شاید یه جایی واقعا آبفاسکیت کردن ضررش بیشتر از سودش باشه!
اما در مورد پروژه
من قبلا با کدهایی کار میکردم که آبفاسکیت بودن و مبهم شدنشون باعث میشد نشه به متدها و خواص داخلی اشیایی که کدشون آبفاسکیت شده دسترسی داشت
در کل برای کسی که داره از یک کد آبفاسکیت شده استفاده میکنه هیچ چیزی عذاب آور تر از این نیست که بعد از دات چیزی رو نبینه🤯
این پروژه دقیقا چیه؟
یک قالب هست برای کدهایی که قراره آبفاسکیت بشن و در اختیار دیگران قرار بگیرن🫤
چطوری کار میکنه؟
شما باید کدتون رو در قالب یک پکیج پایتونی آماده کنید! یکی از مهمترین بخشهای این کار هم نوشتن فایل setup.py هست😮
👈کد خودتون رو میتونید توی یه پوشه مشابه چیزی که میبینید template/src_pkg بذارید
🫵یادتون باشه که یه پروژه خوب پروژهای هست که بشه متدها و توابع داخلیاش رو هم دید پس بهتره که یه پوشه مثل template/stub_pkg هم داشته باشید و توی اون هم یه فایل setup.py برای پکیج stub بذارید
پکیج stub چیه؟
توصیه میکنم برای درک بهتر pep561 رو بخونید.
خلاصه: این یک پکیج شامل فایلهایی مشابه با ساختار پروژه هست که هیچ کد قابل اجرایی توش نیست و صرفا یک سری فایل با پسوند .pyi توش هست که نام تمام ساختارهایی مثل توابع و کلاسها و همچنین نام و نوع پارامترهای ورودی و نوع خروجی اونها با استفاده از type hinting تعریف شده!
تمام LSP(Language Server Protocol) ها ابتدا دنبال فایلهای .pyi میگردن و ساختار پروژه رو از روی اون به کاربر نشون میدن؛ اگر چنین فایلی وجود نداشت میرن سراغ فایل .py
🫴پس اینجا یه امکان خوب داریم تا ساختار پروژه رو(بدون کدهای داخلی) توش نشون بدیم!
من بلد نیستم فایل .pyi رو بنویسم چیکار کنم؟
پکیج mypy توسط بزرگان پایتون از جمله خود آقای روسوم در حال توسعه هست این پکیج ابزاری(stubgen) داره که میتونید باهاش این فایلها رو ایجاد کنید🤗
تهش رو بگو خسته شدیم!
هیچی دیگه این پروژه ۲ تا پکیج whl براتون میسازه یکی پکیج اصلی شما به صورت آبفاسکیت هست و دیگری هم پکیج stub که هر دو رو میشه با pip نصب کرد
🤌خوبیش اینه که حداقل کد آبفاسکیت رو میشه ورژن زد و روی مخزنهای pipطور، نگهداری کرد و اینکه تغییرات ساختاری اون رو هم با پکیج stub دید!
🤝
🔎 @py4ds
اما الان میخوام بیشتر توضیح بدم
‼️یکی از قابلیتهای پایتون این هست که شما میتونید کدهایی با سورس بسته تولید کنید اصطلاحا به این مدل کدها کدهای آبفاسکیت یا مبهم شده میگن
❗️کدی که آبفاسکیت میشه میتونه بعد از یک مدت زمان خاص اکسپایر بشه و دیگه اجرا نشه یا مثلا فقط از طریق یک ماژول خاص(استارتر) اجرا بشه و ماژولهای دیگهی اون به تنهایی اجرا نشن
❓چرا کد نیاز به کد آبفاسکیت داریم؟ دلایل زیادی ممکنه وجود داشته باشه از جمله توسعه دانشهایی که برای یک شرکت درآمدزایی داره و با عمومی شدنش ممکنه به درآمد شرکت ضربه زیادی وارد بشه. دلیل دیگه اینه که ممکنه ویرایش یک کد باعث اختلال توی الگوریتم از پیش تعیین شده بشه پس برای اینکه از تغییرات جلوگیری بشه اونو آبفاسکیت میکنن
در اینکه آیا این کار مفید هست یا نه میشه بحث کرد. شاید یه جایی واقعا آبفاسکیت کردن ضررش بیشتر از سودش باشه!
اما در مورد پروژه
من قبلا با کدهایی کار میکردم که آبفاسکیت بودن و مبهم شدنشون باعث میشد نشه به متدها و خواص داخلی اشیایی که کدشون آبفاسکیت شده دسترسی داشت
در کل برای کسی که داره از یک کد آبفاسکیت شده استفاده میکنه هیچ چیزی عذاب آور تر از این نیست که بعد از دات چیزی رو نبینه🤯
این پروژه دقیقا چیه؟
یک قالب هست برای کدهایی که قراره آبفاسکیت بشن و در اختیار دیگران قرار بگیرن🫤
چطوری کار میکنه؟
شما باید کدتون رو در قالب یک پکیج پایتونی آماده کنید! یکی از مهمترین بخشهای این کار هم نوشتن فایل setup.py هست😮
👈کد خودتون رو میتونید توی یه پوشه مشابه چیزی که میبینید template/src_pkg بذارید
🫵یادتون باشه که یه پروژه خوب پروژهای هست که بشه متدها و توابع داخلیاش رو هم دید پس بهتره که یه پوشه مثل template/stub_pkg هم داشته باشید و توی اون هم یه فایل setup.py برای پکیج stub بذارید
پکیج stub چیه؟
توصیه میکنم برای درک بهتر pep561 رو بخونید.
خلاصه: این یک پکیج شامل فایلهایی مشابه با ساختار پروژه هست که هیچ کد قابل اجرایی توش نیست و صرفا یک سری فایل با پسوند .pyi توش هست که نام تمام ساختارهایی مثل توابع و کلاسها و همچنین نام و نوع پارامترهای ورودی و نوع خروجی اونها با استفاده از type hinting تعریف شده!
تمام LSP(Language Server Protocol) ها ابتدا دنبال فایلهای .pyi میگردن و ساختار پروژه رو از روی اون به کاربر نشون میدن؛ اگر چنین فایلی وجود نداشت میرن سراغ فایل .py
🫴پس اینجا یه امکان خوب داریم تا ساختار پروژه رو(بدون کدهای داخلی) توش نشون بدیم!
من بلد نیستم فایل .pyi رو بنویسم چیکار کنم؟
پکیج mypy توسط بزرگان پایتون از جمله خود آقای روسوم در حال توسعه هست این پکیج ابزاری(stubgen) داره که میتونید باهاش این فایلها رو ایجاد کنید🤗
تهش رو بگو خسته شدیم!
هیچی دیگه این پروژه ۲ تا پکیج whl براتون میسازه یکی پکیج اصلی شما به صورت آبفاسکیت هست و دیگری هم پکیج stub که هر دو رو میشه با pip نصب کرد
🤌خوبیش اینه که حداقل کد آبفاسکیت رو میشه ورژن زد و روی مخزنهای pipطور، نگهداری کرد و اینکه تغییرات ساختاری اون رو هم با پکیج stub دید!
🤝
🔎 @py4ds
Python Enhancement Proposals (PEPs)
PEP 561 – Distributing and Packaging Type Information | peps.python.org
PEP 484 introduced type hinting to Python, with goals of making typing gradual and easy to adopt. Currently, typing information must be distributed manually. This PEP provides a standardized means to leverage existing tooling to package and distribute t...
👏4