Forwarded from DevTwitter | توییت برنامه نویسی
چیزی که ما از ChatGPT میبینیم شروع یه صنعت به اسم AI هست که تازه اول راهه و شاید دهها سال بعد به جایگاه واقعیش برسه
در واقع اگه ChatGPT نتونه جای شمارو بگیره احتمالا AI های بعدی بتونن
ولی چرا نیازی نیست نگرانش باشیم؟
صنایع معمولا از ۲ گروه آدم تشکیل شدن، گروه اول صرفا دنبال بازار کار هستن، یک روال خطی دارن و احتمالا تنها دلیلی که الان داخل این کار هستن اینه که بیکار نشن
در کنارش گروه دوم کسایی هستن که از سر علاقه وارد شدن و متخصص حرفهای هستن که خب صنایع رو همین آدما معمولا رشد میدن
مثلا نویسندهای که الان به ازای هر کلمه ۲۰ تومن میگیره تا محتوای کپی چرخشده رو تحویلتون بده
در مقایسه با کسی که نویسنده حرفهای هست و قدرت قلم گیرا داره
طبیعی هست که گروه اول AI جایگزینشون میشه، حالا اگه تصمیم داریم نگران تغییر شغل نباشید فقط کافی هست جزء گروه اول نباشید
در کنار این از تغییر شغل نباید ترسید، AI اگه یه شغل رو ازتون بگیره یه راه جدید براتون باز میکنه، همونطور که تکنولوژیهای قبلی همین کارو کردن
نهایتا شاید یه روزی تو ۱۰۰ سال بعد AI هممونو بیکار کنه، که خب اشکالی نداره، میشنیم همگی استراحت میکنیم
@DevTwitter |<Soroush Ahamadi/>
در واقع اگه ChatGPT نتونه جای شمارو بگیره احتمالا AI های بعدی بتونن
ولی چرا نیازی نیست نگرانش باشیم؟
صنایع معمولا از ۲ گروه آدم تشکیل شدن، گروه اول صرفا دنبال بازار کار هستن، یک روال خطی دارن و احتمالا تنها دلیلی که الان داخل این کار هستن اینه که بیکار نشن
در کنارش گروه دوم کسایی هستن که از سر علاقه وارد شدن و متخصص حرفهای هستن که خب صنایع رو همین آدما معمولا رشد میدن
مثلا نویسندهای که الان به ازای هر کلمه ۲۰ تومن میگیره تا محتوای کپی چرخشده رو تحویلتون بده
در مقایسه با کسی که نویسنده حرفهای هست و قدرت قلم گیرا داره
طبیعی هست که گروه اول AI جایگزینشون میشه، حالا اگه تصمیم داریم نگران تغییر شغل نباشید فقط کافی هست جزء گروه اول نباشید
در کنار این از تغییر شغل نباید ترسید، AI اگه یه شغل رو ازتون بگیره یه راه جدید براتون باز میکنه، همونطور که تکنولوژیهای قبلی همین کارو کردن
نهایتا شاید یه روزی تو ۱۰۰ سال بعد AI هممونو بیکار کنه، که خب اشکالی نداره، میشنیم همگی استراحت میکنیم
@DevTwitter |<Soroush Ahamadi/>
👍7🆒6👎2👀2🌭1
Forwarded from Sadra Codes
🥚 ایسترگها (Easter egg) و سیکرتهای جالب پایتون!
1️⃣ - توی ترمینال یا CMD، واسه تست پایتونتون، کامند زیر رو ران کنید و پروگرم hello world اجرا میشه.
$
$
3️⃣ - اگه حوصلتون سر رفته و میخواید چند تا کامیک ساینس-طور ببینید، کامند زیر رو ران کنید. بهتون دسترسی به آرشیو xkcd میده که محفلیه پر از میمها و جکهای دنیای خودمون.
$
6️⃣ - میدونستید یه جایگزین جالب واسه آپریشن =! (نامساوی) توی پایتون هست؟!
=> منبع اصلی این پست در Medium
1️⃣ - توی ترمینال یا CMD، واسه تست پایتونتون، کامند زیر رو ران کنید و پروگرم hello world اجرا میشه.
$
python -m hello
Hello World!
2️⃣ - برای چاپ کردن ذن پایتون، کافیه ماژول this رو ایمپورت کنید و یه لیست از استعارههای بامفهوم برنامهنویسی رو واستون چاپ میکنه.$
python -c 'import this'
👈 ماژول ذن this.py در ریپازیتوری CPython3️⃣ - اگه حوصلتون سر رفته و میخواید چند تا کامیک ساینس-طور ببینید، کامند زیر رو ران کنید. بهتون دسترسی به آرشیو 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
FDD
خودم شخصا با این روش حال نمیکنم. خیلی تک بعدی میشه و بعدا یقتون رو میگیره. این نظرم شخصیمه البته, ممکنه اشتباه باشه.
@ManiFoldsPython
خودم شخصا با این روش حال نمیکنم. خیلی تک بعدی میشه و بعدا یقتون رو میگیره. این نظرم شخصیمه البته, ممکنه اشتباه باشه.
@ManiFoldsPython
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
اما این وسط یک مشکل داشت 😁
وقتی 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 هم میتونید از همچین کدی استفاده کنید
@ManiFoldsPython
import gcمود های دیگه هم داره که میتونید از سورس کد ببینید. البته تو این کیس به درد من نمیخورد چون gc فکر میکرد کارشو انجام داده 😅
gc.enable()
gc.set_debug(gc.DEBUG_LEAK)
@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
اگه زدین تسلط دارین رو ردیس, پس باید بدونید 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 تعریف نشده. پس حتی متود
خلاصه اگه از asyncio.get_event_loop رو ویندوز استفاده میکنید حواستون به این نکته باشه که حتما باید close بخوره وگرنه هم مموری لیک خواهید داشت و هم port exhaustion.
سعی کردم PR بزنم به پایتون, اول فکر کردم مشکل از asyncio هست ولی ظاهرا مشکل از gc هست و gc خیلی پیچیده تر و ادونس تر از سطح منه که بخوام PR بزنم و این مشکلو برطرف کنم. بنابراین issue میزنم 😁
@ManiFoldsPython
حالا اینکه چرا پورت باز میشه نمیدونم ولی این تو 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@ManiFoldsPython
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
👍3
Forwarded from DevTwitter | توییت برنامه نویسی
در github که میچرخی ... کدهای ملت اینطوری است که مثلا پایتونها معمولا در چند فایل محدود چند تا کتابخونه معروف صدا و یک کار قابل توجه این وسط با کدهای تجمیع شده انجام میشه ..
کدهای سی شارپ شبیه آفتابه لگن هفت دست شام و نهار هیچی!
صد جور فایل اینترفیس، مدل و انتیتی و ...
و نهایتاً میبینی چند هزار خط کد است که واقعا کار مهمی انجام نمیده و اصل کار هم شاید قابل توجه نباشه...
جاواییها و سی شارپیها زیادی درگیر دیزاین پترن هستند تا کاری که کد باید انجام بده ..
@DevTwitter | <Alireza Shirazi/>
کدهای سی شارپ شبیه آفتابه لگن هفت دست شام و نهار هیچی!
صد جور فایل اینترفیس، مدل و انتیتی و ...
و نهایتاً میبینی چند هزار خط کد است که واقعا کار مهمی انجام نمیده و اصل کار هم شاید قابل توجه نباشه...
جاواییها و سی شارپیها زیادی درگیر دیزاین پترن هستند تا کاری که کد باید انجام بده ..
@DevTwitter | <Alireza Shirazi/>
👎8👍2
DevTwitter | توییت برنامه نویسی
در github که میچرخی ... کدهای ملت اینطوری است که مثلا پایتونها معمولا در چند فایل محدود چند تا کتابخونه معروف صدا و یک کار قابل توجه این وسط با کدهای تجمیع شده انجام میشه .. کدهای سی شارپ شبیه آفتابه لگن هفت دست شام و نهار هیچی! صد جور فایل اینترفیس، مدل…
مزخرف ترین طرز فکر. قطاری کد بنویسید بریزین تو چند فایل. که دیگه بعدا کسی جز خودتون نتونه اونو maintain کنه 🤦♂️
اینجا که به حجم کد اشاره نشده, ولی حتی کد اگه 200 خط هم باشه نباید بدون logic و architecture باشه. چون بالاخره ممکنه درآینده بیشتر برگردین و روش کار کنید. خشت اول رو که کج بذارین ساختمون کج بالا میره, اون موقع وقتی میرسین طبقه 5-10 مجبور میشین ساختمونو خراب کنید و ریفکتور کنید.
لزومی نداره حالا از یک دیزاین پترن خاص و مشخصی استفاده کنید ولی همینکه منطقی باشه و کسی که میبینتش سریع درکش کنه کافیه. هیچ کتابخونه خوبی پیدا نمیکنید که اینطوری نباشه. یک سری قواعد باید همه جا رعایت شه حتی برای کد های کم مثل SOLID و ...
@ManiFoldsPython
اینجا که به حجم کد اشاره نشده, ولی حتی کد اگه 200 خط هم باشه نباید بدون logic و architecture باشه. چون بالاخره ممکنه درآینده بیشتر برگردین و روش کار کنید. خشت اول رو که کج بذارین ساختمون کج بالا میره, اون موقع وقتی میرسین طبقه 5-10 مجبور میشین ساختمونو خراب کنید و ریفکتور کنید.
لزومی نداره حالا از یک دیزاین پترن خاص و مشخصی استفاده کنید ولی همینکه منطقی باشه و کسی که میبینتش سریع درکش کنه کافیه. هیچ کتابخونه خوبی پیدا نمیکنید که اینطوری نباشه. یک سری قواعد باید همه جا رعایت شه حتی برای کد های کم مثل SOLID و ...
@ManiFoldsPython
👍4
مشابه میخواین برین سراغ همین رفیق من undetected chromedriver 😂
یک ریپویی که 5 هزار ستاره خورده
739 تا فورک
ولی کلا 8 تا contributer داره. کسیم سر از کدش در نمیاره. سعی میکنن خیلی به کد دست نزنن چون legacy بزرگی پشتشه 😅
اولین کامیت کد هم 250 خط بود همشو ریخته بود تو یک فایل!
همشم بخاطر همینه که معماری درستی نداشت. شاید یکی بتونه کداشو کلین کنه چون بالاخره خط به خط جلومیری کدو کلین میکنی ولی کلین کردن architecture یک پروژه واقعا پروسه سخت و طاقت فرسایی هست و البته باعث از بین رفتن backward compatibility هم میشه. یک مثال دیگه میزنم از یک پروژه بسیار بزرگ تر تا اینکه این قضیه خشت اولی که کج گذاشته میشه رو جدی تر بگیرین.
@ManiFoldsPython
یک ریپویی که 5 هزار ستاره خورده
739 تا فورک
ولی کلا 8 تا contributer داره. کسیم سر از کدش در نمیاره. سعی میکنن خیلی به کد دست نزنن چون legacy بزرگی پشتشه 😅
اولین کامیت کد هم 250 خط بود همشو ریخته بود تو یک فایل!
همشم بخاطر همینه که معماری درستی نداشت. شاید یکی بتونه کداشو کلین کنه چون بالاخره خط به خط جلومیری کدو کلین میکنی ولی کلین کردن architecture یک پروژه واقعا پروسه سخت و طاقت فرسایی هست و البته باعث از بین رفتن backward compatibility هم میشه. یک مثال دیگه میزنم از یک پروژه بسیار بزرگ تر تا اینکه این قضیه خشت اولی که کج گذاشته میشه رو جدی تر بگیرین.
@ManiFoldsPython
👍2
یک نمونه دیگه از جنگو!
نقل قول از کتاب two scopes of django
اگه query جنگو آبجکت عجیب غریبی نبود و lazy evaluate بودنش خیلی ساده تر پیاده سازی میشد یا اصلا پیاده نمیشد, الان قابلیت تغییر درایور به asyncpg وجود داشت که تو پرفومنس در مقایسه با psycopg شوخیه, و دست زدن بهش باعث از بین رفتن backward compalitity میشه و کلا کل کد و queryهایی که زدین رو باید از اول بنویسید, که خب بنظر نمیرسه حداقل حالا حالا ها همچین اتفاقی بیفته.
@ManiFoldsPython
نقل قول از کتاب two scopes of django
اگه query جنگو آبجکت عجیب غریبی نبود و lazy evaluate بودنش خیلی ساده تر پیاده سازی میشد یا اصلا پیاده نمیشد, الان قابلیت تغییر درایور به asyncpg وجود داشت که تو پرفومنس در مقایسه با psycopg شوخیه, و دست زدن بهش باعث از بین رفتن backward compalitity میشه و کلا کل کد و queryهایی که زدین رو باید از اول بنویسید, که خب بنظر نمیرسه حداقل حالا حالا ها همچین اتفاقی بیفته.
@ManiFoldsPython
👍2
دو فریم ورک برای dependancy injection
Python dependency injection framework, inspired by Guice
Dependency injection framework for Python
@ManiFoldsPython
Python dependency injection framework, inspired by Guice
Dependency injection framework for Python
@ManiFoldsPython
GitHub
GitHub - python-injector/injector: Python dependency injection framework, inspired by Guice
Python dependency injection framework, inspired by Guice - python-injector/injector
👍2