عملگر والروس (Walrus Operator) با نماد := که در نسخه ۳.۸ پایتون معرفی شد، یکی از ابزارهای قدرتمند برای نوشتن کدهای کوتاهتر و کارآمدتر است. این عملگر در واقع یک عبارت انتساب (Assignment Expression) محسوب میشود که به شما اجازه میدهد همزمان یک متغیر را مقداردهی کرده و از همان مقدار در عبارت بیرونی (مانند یک شرط یا حلقه) استفاده کنید.
نکته فنی مهم: برخلاف بسیاری از تصور میکنند، این عملگر مقدار ثابتی مانند True یا None را برنمیگرداند؛ بلکه خودِ مقداری که به متغیر نسبت داده میشود را به عنوان نتیجهی عملگر باز میگرداند. این ویژگی باعث میشود که بررسی نوع داده (مانند تشخیص None از یک رشتهی خالی) بسیار دقیقتر و منطقیتر انجام شود.
مثال ۱: استفاده در شرط (if)
def read_config(key):
# فرض کنید این تابع مقدار کلید را از فایل کانفیگ میخواند
# اگر کلید وجود نداشته باشد، None برمیگرداند
config = {"debug": True, "max_retries": 3, "timeout": None}
return config.get(key)
# بررسی تنظیمات با استفاده از عملگر والروس
if (value := read_config("debug")) is not None:
print(f"Debug mode is: {value}")
else:
print("Debug setting not found")
if (value := read_config("timeout")) is not None:
print(f"Timeout is set to: {value} seconds")
else:
print("Timeout not configured, using default")
مثال ۲: استفاده در حلقه (while)
my_list = [10, 20, 30, None, 50]
def get_next_item(data_source):
"""
یک آیتم از لیست برمیگرداند.
اگر لیست خالی شده باشد، None برمیگرداند.
"""
if data_source:
return data_source.pop(0)
else:
return None
# حلقهای که تا زمانی که دادهای وجود دارد (None نباشد) ادامه مییابد
while (item := get_next_item(my_list)) is not None:
print(f"Processing: {item}")
print("Done!")
در مثال شرط، تابع read_config فقط یک بار فراخوانی میشود. نتیجه در متغیر value ذخیره شده و همزمان در شرط بررسی میشود. اگر مقدار None باشد، پیام مناسب نمایش داده میشود.
در مثال حلقه، تابع get_next_item به صورت پیوسته آیتمها را از my_list خارج میکند. در هر مرحله: 1. اگر لیست خالی نباشد، اولین آیتم حذف و به item داده میشود. 2. اگر لیست خالی شود، None برگردانده میشود. 3. چون None is not None نادرست است، حلقه متوقف میشود. این روش از فراخوانی تکراری تابع برای بررسی خالی بودن لیست جلوگیری میکند و کد را خواناتر میسازد.
مزایای کلیدی:
- جلوگیری از فراخوانی تکراری: در توابعی که فراخوانی آنها هزینهبر است یا اثر جانبی دارد، نیازی به ذخیرهسازی جداگانهی متغیر نیست.
- بررسی صحت مقدار: میتوان مستقیماً نوع مقدار برگشتی (مانند
Noneیا رشتهی خالی) را در شرط بررسی کرد. - کد تمیزتر: منطق «دریافت و بررسی» در یک خط جمع میشود.
نکات مهم:
- مقدار بازگشتی عملگر، دقیقاً همان مقداری است که به متغیر نسبت داده میشود (مثلاً
None، عدد، یا رشته). - استفاده از
is not Noneیا مقایسههای دقیقتر (به جای!= ""برای رشتهها) برای جلوگیری از خطاهای منطقی ضروری است. - درون
lambdaنمیتوان از این عملگر استفاده کرد. - در عبارات شرطی پیچیده، استفاده از پرانتز الزامی است.
نام والروس: نماد := به دلیل شباهت ظاهری به چشمها و دندانهای گراز دریایی (Walrus) این نام را گرفته است.