دلیل استفاده از := برای assignment همزمان با چک کردن شرط در Python 3.8

چند وقت پیش با خودم فکر می‌کردم میشه توی پایتون همزمان هم شرط if یا while رو چک کرد هم assignment انجام داد یا نه؟ مثلا من قراره تا زمانی که کاربر عدد منفی نزده ازش ورودی بگیرم و توی n ذخیره کنم، یه همیچین چیزی توی ذهنم بود:

while (n = int(input())) > -1:
    # do something with n

که فهمیدم نمیشه، interpreter دقیقا یه فلش میزد روی = و می‌گفت این چیه

چند روز پیش متوجه شدم که این قابلیت به Python ورژن 3.8 اضافه شده ولی به جای = باید := زد:

while (n := int(input())) > -1:
    # do something with n

چرا؟؟ برای چی از همون = استفاده نکردن؟ فکر کنم یه همیچین چیزی باید توی cpp و java وجود داشته باشه و اونا از همون = دارن استفاده می‌کنن.

1 Likes

والا منم موندم چرا - تازه میتونستن اینطوری بزار خیلی بهتر میشد

if (str.find('9') as varname) == 2:

کامیونیتیش از این تصمیم خوشحال نبودن تا جایی که یادمه

2 Likes

راستش روزی که پایتون رو شروع کردم فکر میکردم چقد راحته و همه چی باهم جفت و جور میشه.

کم کم فهمیدم پایتون اونقدرا هم قشنگ و دلربا نیست.
خیلی جاها از doc اش که اصلا قابل فهمیدن نیست مگر این که با اون مبحث توی ی زبون دیگه مثل cpp کار کرده باشی.

واقعا چرا باید دوتا کلاس واسه pathlib داشته باشیم که یکیش واسه windows باشه و یکی دیگه واسه unix ??? چرا خود برنامه نویس باید اینارو چک کنه نه خود پایتون

بعد از چندین سال هم تصمیم گرفتن ی سیستم typing بهش اضافه کنن

2 Likes

کلا اکثر زبان های برنامه نویسی بعد از مدتی ایده های جدید برای توسعه ندارن و رو میارن به مواردی که ترند هست یا توی زبان های دیگه وجود داره ( نه این که بد باشه این موضوع ). یه سری از این موارد با ایده های اصلی و پایه این اون زبان خوانایی داره و خوب از آب در میان و یه سری های دیگه بد می شن.

اما در مورد پایتون. بد نیست یه نگاه به zen of python بندازین و ببینید پایتون امروز چقدر بهش شبیه هست ؟

3 Likes

یه موضوعی که هست اینه که من خیلی با این تغییر سینتکس (در این مورد شاید بهتر باشه گفت اضافه شدن سینتکس) موافق نیستم
از پایتون 3.6 یه چیزی اضافه شده به اسم fstring که می‌شه به جای این کد:

str_with_a_b = "a is {} and b is {}".format(a, b)

این کد رو نوشت:

str_with_a_b = f"a is {a} and b is {b}"

ولی من هنوز که هنوزه بعد از 5 سال که پایتون 3.6 release شده جرئت نمی‌کنم ازش استفاده کنم. چون یه بار پیش‌ اومده که یه پروژه کوچیک برای کار با db برای یکی نوشتم و سر همین قضیه اجرا نشده، شخصی که کد رو بهش دادم کد رو تحویل داده بود به یکی دیگه و اونم فقط بهش گفته بود ارور می‌ده!! نه متن ارور نه اسکرین شات هیچی، آخرشم گفت فکر کنم ورژن پایتونش 3.5 باشه و با همون pyenv که چند سال پیش خودتون بهم معرفی کردین رفتم 3.5 نصب کردم دیدم مشکل از همینه! از اون موقع به بعد دیگه جرئت نمی‌کنم fstring یا چیزای جدیدی که به پایتون اضافه می‌شه رو استفاده کنم، با اینکه بعضیاش شاید کاربردی باشه.

نکته دیگه‌ای که هست اینه که آیا واقعا الآن مشکل پایتون جدا کردن positional آرگومان‌ها یا assign کردن در حین بررسی شرط هستش؟ بهتر نیست روی چیزای دیگه‌ای کار کنن؟
نمی‌خوام حرفم غیرحرفه‌ای به نظر برسه، مثل کسایی که تازه می‌خوان برنامه‌نویسی رو شروع کنن و می‌پرسن کدوم زبان از همه سریع‌تره یا می‌پرسن این زبان سریع‌تره یا اون زبان؟ ولی باید قبول کنیم پایتون به طرز مسخره‌ای کنده، خیلی خیلی کند که من واقعا درک نمی‌کنم چرا؟ کلا هرچیز درست و حسابی ای که توی ML داره استفاده می‌شه با C++ نوشته شده و Python فقط یه wrapper براشه و برای این هم که سریع کار کنه دقیقا باید مثل یه framework باهاش رفتار کنی که یه خط Python ای که می‌نویسی هزار خط C++ اجرا کنه تا سریع باشه وگرنه خیلی خیلی کند اجرا می‌شه، نمونش numpy که توی پایتون بهمون array میده، چند وقت پیش یه برنامه نوشتم که تعداد زیادی list پایتون و array با numpy تولید می‌کرد و با یه seed مشخص بهشون به صورت random دسترسی پیدا می‌کرد، توقع می‌ره array های numpy به مراتب سریع تر باشن، ولی نبودن، فقط در صورتی سریع‌تره که به شکلی که خود numpy میخواد باهاش vectorized operation انجام بدی!

سوال اصلی اینجاست که اگه اینجوریه و پایتون انقدر کنده که عملا باید اینجوری باهاش کار کرد دیگه این همه ادعا در مورد سرعت توسعه و hackable بودن و تغییر دادن data model به چه دردی می‌خوره؟

2 Likes

با این مسال کاملا موافقم. پایتون توی abstraction خوب عمل نکرده.

درمورد incompatible بودن که افتضاح عمل کرده. اونم در حالتی که build tool و package manager درست‌حسابی هم نداره.

من به پایتون به عنوان یه زبان اسکریپت‌نویسی برای کارهای خیلی ریزه‌میزه نگاه میکنم. استفاده ازش برای هرچیز بزرگتری اشتباهه. زبانی که یه concorency واقعی از توش در نمیاد، فقط به درد همینکار میخوره!
برای اسکریپت‌نویسی و مثلا اتوماتیک کردن یه تسک ساده هم اصولا bash رو انتخاب میکنم به جای پایتون.

فکر میکنم اینا همش بهونست. طرفدارهای پایتون صرفا راحتیش رو میبینن.
انجام کارهای کوچیک توش راحته.

3 Likes

در کل پایتون سینتکس جالبی نداره و مشکلات متعددی داره و به نظر من باید در حد bash استفاده بشه فقط تو زمینه‌های بیشتر. ولی در همون اندازه. (قصد توهین به bash رو ندارم ولی تا جایی که من دیدم برای اسکریپت‌های کوچیک نصب یا آپدیت استفاده میشه نه بیشتر)

1 Likes