Python BackendHub – Telegram
Python BackendHub
7.5K subscribers
314 photos
46 videos
11 files
432 links
Learning python & Backend Engineering, with Mani!

Youtube: https://www.youtube.com/@GitOverHere
Github: https://github.com/ManiMozaffar
Linkedin: https://www.linkedin.com/in/manimozaffar

تبلیغات نداریم

Admin: @Mani_nikou
Download Telegram
Forwarded from Sadra Codes
🥚 ایسترگ‌ها (Easter egg) و سیکرت‌های جالب پایتون!

1️⃣ - توی ترمینال یا CMD، واسه تست پایتونتون، کامند زیر رو ران کنید و پروگرم hello world اجرا میشه.

$ python -m hello
Hello World!

2️⃣ - برای چاپ کردن ذن پایتون، کافیه ماژول this رو ایمپورت کنید و یه لیست از استعاره‌های بامفهوم برنامه‌نویسی رو واستون چاپ می‌کنه.

$ python -c 'import this'

👈
ماژول ذن this.py در ریپازیتوری CPython

3️⃣ - اگه حوصلتون سر رفته و می‌خواید چند تا کامیک ساینس-طور ببینید، کامند زیر رو ران کنید. بهتون دسترسی به آرشیو xkcd میده که محفلیه پر از میم‌ها و جک‌های دنیای خودمون.

$ python -c 'import antigravity'

4️⃣
- اگه می‌خواید از فیچر‌هایی که قراره در آینده به پایتون اضافه شه استفاده کنید، می‌تونید از __future__ استفاده کنید. مثلا توی پایتون۲، پرینت یه تابع نبود ولی اگه ماژول زیر رو ایمپورت می‌کردید، مفسر پایتون۲ از این به بعد به دید یه فانکشن به print نگاه می‌کرد و باید از پرانتز جلوی پرینت استفاده می‌کردید.

#!/usr/bin/python2
from future import print_function

حالا نکته جالبش اینجاس که ما توی تقریبا تمام زبان هایی که بیسشون C هست، از {} بعنوان تعیین اسکوپ فانکشن، شروط، کلس‌ها و.. استفاده می‌کنیم که توی پایتون به این شکل نیست و block-indentation مهمه. حالا اگه سعی کنید braces رو از __future__ ایمپورت کنید میاد و اینجوری بهتون تیکه میندازه..

>>> from future import braces
SyntaxError: not a chance

5️⃣ - می‌دونستید میشه هش بی‌نهایت و Not-a-numbert رو توی پایتون نشون داد..؟! جالبه نه؟

>>> hash(float('inf'))
314159
>>> hash(float('nan'))
0

👈 اینجا جاییه که بعنوان دوتا ثابت در کدبیس CPython تعریف شدن

6️⃣ - میدونستید یه جایگزین جالب واسه آپریشن =! (نامساوی) توی پایتون هست؟!

>>> 1 != 0
True
>>> from future import barry_as_FLUFL
>>> 1 != 0
SyntaxtError: with Barry as BDFL, use '<>' instead of '!='
>>> 1 <> 0
True
>>> 2 <> 2
False

شاید واستون جالب باشه ولی این قضیه بعد از اینکه Maintain پروژه پایتون توسط Guido به Barry داده شد، رواج پیدا کرد. واسش حتی PEP401 هم نوشتن که من (شخصا) موجودیتش رو درک نکردم ولی ارزش خوندن داره و نکات جالبی درباره تاریخچه پایتون میگه. :)

=> منبع اصلی این پست در Medium
👍5
Forwarded from Sadra Codes
Pythoinc Development (IMO)
👍6
Sadra Codes
Pythoinc Development (IMO)
چند تا دیگه هم بررسی میکنیم.
Waterfall

@ManiFoldsPython
👍5
FDD

خودم شخصا با این روش حال نمیکنم. خیلی تک بعدی میشه و بعدا یقتون رو میگیره. این نظرم شخصیمه البته, ممکنه اشتباه باشه.

@ManiFoldsPython
👍5🤮1
Python BackendHub
حالا برسیم به چالش پروژش که برای من بود و هنوزم هست :)) https://github.com/ultrafunkamsterdam/undetected-chromedriver این لایبری رو میبینید؟ جناب آقای ultrafunkamsterdam که اونرشیپشو دارن, بسیارم تو حوضه خودشون مهارت دارن ولی متاسفانه هرجا دستشون میرسیده…
این باگو یادتونه؟ امروز رفتم سراغش که دیباگش کنم. متوجه شدم که وقتی chrome devtool رو تو undetected روشن میکنید میاد یک listener میذاره رو self.driver. بعد وقتی درایور رو میبندین میاد listener رو که باز کرده میبنده. این لیستنر که خودش بهش میگه reactor از threading.Thread ارث بری میکنه. وقتی self.event.is_set داخل کلس false برگردونه خارج میشه از listener و دیگه درخواست نمیزنه.

اما این وسط یک مشکل داشت 😁
وقتی self.driver استفاده کرده ولی self.driver اومده quit شده و gc هم کالکتش کرده, تازه threading.Thread میره که listener رو ببنده. میبینه self.driver یک رفرنسی هست که به چیزی پوینت کرده که اصلا وجود نداره برای همین کالکتش نمیکنه و ارور میخوره! در نتیجه 2 تا پورتی که گرفته باز میمونه و ESTABLISHED باقی خواهد ماند. 2 تا 2تا جمع میشه تا 65 هزار تا پر میشه. و بعدش port های سیستم پر میشه.

پس وقتی از threading.Thread دارین استفاده میکنید حسابی حواستون به رفرنس هاتون باشه که برای خودتون circular reference درست نکنید. اگه درست کردین حتما باید resolve اش کنید. چطوری؟ صبر کنید تا به ترتیب آبجکت هاتون delete شن بعد ادامه بدین. تو این کیس من برای حل کردنش اول listener رو مطمئن شدم که خارج شده ازش, بعد loop ها رو بستم. بعدش خود آبجکت Thread هم اومدم del کردم. بعدش رفتم سراغ مرورگر و اونو بستم.

پایتون میتونه circular reference رو هندل کنه ولی تو این مورد پورت لیک میموند. دلیلش چیه؟ چون تو ویندوز شما نمیتونید کانکشن هایی که تو یک process ID هستن رو ببندید. ولی تو لینوکس میتونید. بنابراین اگه رو لینوکس از Undetected استفاده میکردین اصلا کانکشن لیک نداشتین.

@ManiFoldsPython
👍3
برای دیباگ مموری لیک GC هم میتونید از همچین کدی استفاده کنید

import gc
gc.enable()
gc.set_debug(gc.DEBUG_LEAK)

مود های دیگه هم داره که میتونید از سورس کد ببینید. البته تو این کیس به درد من نمیخورد چون gc فکر میکرد کارشو انجام داده 😅
@ManiFoldsPython
موقع پرزنت کردن اسکیل ها یک مشکلی وجود داره, اینکه یک نفر چون ردیس رو ایمپورت کرده تو پروژه تست جنگوش و یک استفاده basic داشته ازش فکر میکنه درواقع redis بلده در صورتی که واقعا اینطور نیست.

اگه زدین تسلط دارین رو ردیس, پس باید بدونید real time data رو تو ردیس چطور هندل میکنن. باید بدونید race condition چطور هندل میشه. باید بدونید pipe line و watch چیه. باید بدونید lua noscripting چیه و به چه دردی میخوره. باید بدونید چطور بک آپ و snapshot میگیرن ازش. باید بدونید ردیس پاب چطور کار میکنه؟ باید بدونید وقتی رمش پر میشه چه بلایی سرش میاد. باید بدونید LRU policy تو ردیس چیه؟

مثلا لیست اسکیل های یک نفرو میبینی کلی اسکیل زده. خب این شاید اشکالی نداشته باشه, شایدم داشته باشه, ولی حداقل موقع پزرنت اسکیلتون سعی کنید چیزایی که واقعا بلدین و واقعا تخصصتونه رو بگین بلدین, و با بقیه آشنایی دارین. این کلمه تسلط و آشنایی رو خیلیا اشتباه میگیرن. خب تو رزومه معقول نیست جلوی skill بنویسید که این اسکیل رو شما مسلط هستین, یا familiar هستین. اگه چیزایی که familiar هم نیستین رو ننویسید احتمال ریجکت رزومتون خیلی بالا میره. مثلا نوشتن یک docker compose چیزیه که باید همه بلد باشن, ولی انتظار ندارن ازتون که مثلا یک microservice با docker و k8s و doker swarm بالا بیارین که fault-tolerant باشه.

و خیلی سعی کنید کلمه یا تکنولوژی که ازش صحبت میکنید رو حداقل درک کنید که درست باشه. مثلا اینکه sql بلد باشین با اینکه postgresql بلد باشین خیلی فرق داره. وقتی میگین من postgresql آشنایی دارم, یعنی میدونم materialize view چیه. میدونم Full-text search چیه. میدونم date trunc query چیه و به چه دردی میخوره. میدونم postgresql درواقع دیتا تایپ های مختلفی داره مثل json یا Array یا HStore. میدونم تو بحث ایندکس, تفاوتش با sqlite مثلا اینه که partial و functional index داره.

ببینید, نمیگم اینا رو بلد باشین. ولی وقتی میگین با postgresql آشنایی دارین یعنی اینا رو حداقل میدونید. شاید استفاده نکردین یا سراغشون نرفتین, ولی از وجودشون خبر دارین. اگه از وجود اینا خبر ندارین و صرفا یک sql query بلدین اون موقع تو اسکیلتون باید بنویسید sql نه postgresql.

و مهم تر از همه اینا, تو رزومتون اگه به این موارد تسلط دارین, سعی کنید به نحوه تو بولت پوینت هاتون این قضیه رو نشون بدید. تفاوت آشنایی و تسلط تو بولت پوینت باید مشخص شه, نه اینکه جلوی اسکیل ستاره بدین به خودتون.

@ManiFoldsPython
👍12
Python BackendHub
این باگو یادتونه؟ امروز رفتم سراغش که دیباگش کنم. متوجه شدم که وقتی chrome devtool رو تو undetected روشن میکنید میاد یک listener میذاره رو self.driver. بعد وقتی درایور رو میبندین میاد listener رو که باز کرده میبنده. این لیستنر که خودش بهش میگه reactor از …
اینو هرچی بیشتر دیباگ میکنم I’m دارک تر میشه:)) امروز با یکی از دوستان داشتیم دیباگش میکردیم که متوجه شدیم وقتی از asyncio.get_event_loop تو ویندوز استفاده میکنید یک پورت باز میکنه و این اصلا ربطی به undetected نداشت.

حالا اینکه چرا پورت باز میشه نمیدونم ولی این تو windows_event.py هست تو پایتون, و تو ویندوز اتفاق میفته.
نکته جالب اینجاست که gc وقتی آبجکتی رو کالکت میکنه که احساس میکنه نیاز به کالکت شدن داره, و برای port exhaustion تعریف نشده. پس حتی متود __del__ که خودشون نوشتن هیچوقت صدا زده نمیشه, به جز زمانی که اسکریپت متوقف میشه.

خلاصه اگه از asyncio.get_event_loop رو ویندوز استفاده میکنید حواستون به این نکته باشه که حتما باید close بخوره وگرنه هم مموری لیک خواهید داشت و هم port exhaustion.

سعی کردم PR بزنم به پایتون, اول فکر کردم مشکل از asyncio هست ولی ظاهرا مشکل از gc هست و gc خیلی پیچیده تر و ادونس تر از سطح منه که بخوام PR بزنم و این مشکلو برطرف کنم. بنابراین issue میزنم 😁
@ManiFoldsPython
👍7
Python BackendHub
اینو هرچی بیشتر دیباگ میکنم I’m دارک تر میشه:)) امروز با یکی از دوستان داشتیم دیباگش میکردیم که متوجه شدیم وقتی از asyncio.get_event_loop تو ویندوز استفاده میکنید یک پورت باز میکنه و این اصلا ربطی به undetected نداشت. حالا اینکه چرا پورت باز میشه نمیدونم…
کد نمونه برای تست:
import asyncio
import psutil
import os
import gc


def check_connections():
"""Check count of ESTABLISHED connections."""
return len([
conn for conn in psutil.net_connections()
if conn.status == 'ESTABLISHED' and conn.pid == os.getpid()
])


loop = asyncio.get_event_loop()
print(check_connections()) #2
loop = None # or del loop
gc.collect()
print(check_connections()) #2

@ManiFoldsPython
👍3
در github که میچرخی ... کدهای ملت اینطوری است که مثلا پایتون‌ها معمولا در چند فایل محدود چند تا کتابخونه معروف صدا و یک کار قابل توجه این وسط با کدهای تجمیع شده انجام میشه ..
کدهای سی شارپ شبیه آفتابه لگن هفت دست شام و نهار هیچی!
صد جور فایل اینترفیس، مدل و انتیتی و ...
‏و نهایتاً می‌بینی چند هزار خط کد است که واقعا کار مهمی انجام نمیده و اصل کار هم شاید قابل توجه نباشه...
جاوایی‌ها و سی شارپی‌ها زیادی درگیر دیزاین پترن هستند تا کاری که کد باید انجام بده ..

@DevTwitter | <Alireza Shirazi/>
👎8👍2
DevTwitter | توییت برنامه نویسی
در github که میچرخی ... کدهای ملت اینطوری است که مثلا پایتون‌ها معمولا در چند فایل محدود چند تا کتابخونه معروف صدا و یک کار قابل توجه این وسط با کدهای تجمیع شده انجام میشه .. کدهای سی شارپ شبیه آفتابه لگن هفت دست شام و نهار هیچی! صد جور فایل اینترفیس، مدل…
مزخرف ترین طرز فکر. قطاری کد بنویسید بریزین تو چند فایل. که دیگه بعدا کسی جز خودتون نتونه اونو maintain کنه 🤦‍♂️

اینجا که به حجم کد اشاره نشده, ولی حتی کد اگه 200 خط هم باشه نباید بدون logic و architecture باشه. چون بالاخره ممکنه درآینده بیشتر برگردین و روش کار کنید. خشت اول رو که کج بذارین ساختمون کج بالا میره, اون موقع وقتی میرسین طبقه 5-10 مجبور میشین ساختمونو خراب کنید و ریفکتور کنید.

لزومی نداره حالا از یک دیزاین پترن خاص و مشخصی استفاده کنید ولی همینکه منطقی باشه و کسی که میبینتش سریع درکش کنه کافیه. هیچ کتابخونه خوبی پیدا نمیکنید که اینطوری نباشه. یک سری قواعد باید همه جا رعایت شه حتی برای کد های کم مثل SOLID و ...
@ManiFoldsPython
👍4
مشابه میخواین برین سراغ همین رفیق من undetected chromedriver 😂
یک ریپویی که 5 هزار ستاره خورده
739 تا فورک
ولی کلا 8 تا contributer داره
. کسیم سر از کدش در نمیاره. سعی میکنن خیلی به کد دست نزنن چون legacy بزرگی پشتشه 😅
اولین کامیت کد هم 250 خط بود همشو ریخته بود تو یک فایل!

همشم بخاطر همینه که معماری درستی نداشت. شاید یکی بتونه کداشو کلین کنه چون بالاخره خط به خط جلومیری کدو کلین میکنی ولی کلین کردن architecture یک پروژه واقعا پروسه سخت و طاقت فرسایی هست و البته باعث از بین رفتن backward compatibility هم میشه. یک مثال دیگه میزنم از یک پروژه بسیار بزرگ تر تا اینکه این قضیه خشت اولی که کج گذاشته میشه رو جدی تر بگیرین.
@ManiFoldsPython
👍2
یک نمونه دیگه از جنگو!
نقل قول از کتاب two scopes of django
اگه query جنگو آبجکت عجیب غریبی نبود و lazy evaluate بودنش خیلی ساده تر پیاده سازی میشد یا اصلا پیاده نمیشد, الان قابلیت تغییر درایور به asyncpg وجود داشت که تو پرفومنس در مقایسه با psycopg شوخیه, و دست زدن بهش باعث از بین رفتن backward compalitity میشه و کلا کل کد و queryهایی که زدین رو باید از اول بنویسید, که خب بنظر نمیرسه حداقل حالا حالا ها همچین اتفاقی بیفته.

@ManiFoldsPython
👍2
یکی از کارایی که من همیشه میکنم اینه که تو پروژه هام از draw.io استفاده میکنم.
یک markup language هم خودش داره, که باهاش میتونید این جدول هارو بکشید. بعد همون مارک آپش رو آپلود کنید تو سایتش نشون میده جدول رو مطابق عکس
دیزاین پروژه رو داخلش میکشم, حالا میتونه دیتابیس باشه یا design pattern یا هرچیز دیگه ای, بعد همونو تو github repo هم میذارم. اینطوری یک نفر دیگه همون فایلو باز کنه خیلی سریع دیزاین دستش میاد بدون اینکه کد رو بخونه.

@ManiFoldsPython
👍5🤝2