آدرس : تهران میدان فردوسی خیابان ایرانشهر بین سمیه و طالقانی مجتمع تجاری میلاد واحد 9

پشتیبانی 24 ساعته : 02188867940 – 09927674217

برای مشاهده لیست علاقه مندی ها وارد شوید!

مشاهده محصولات فروشگاه
0

هیچ محصولی در سبد خرید نیست.

توابع تزئینی که استدلال ها را می پذیرند

دسته بندی :اخبار سایت 21 فوریه 2023 علیرضا بابامرادی 281

همه نمونه‌ها تا کنون فقط یک تابع خوشامدگویی ساده را تزئین کرده‌اند که به هیچ وجه استدلال نمی کرد. تا به حال، دکوراتورهایی که در اینجا مشاهده کردید، مجبور نبودند با ارسال استدلال به آنها سر و کار داشته باشند اگر سعی کنید یکی از این دکوراتورها را روی عملکردی که آرم بندی می کند اعمال کنید، به درستی کار نخواهد کرد. چگونه یک تابع را تزئین می کنید که استدلال های دلخواه می گیرد؟ تابع ورودی اینجاست که *args و **kwargs پایتون ویژگی3 دارند تعداد متغیر آرگومان مفید است. پروکسی زیر برای برخورد با دکوراتور از این مزیت استفاده می کند:def wrapper(*args, **kwargs): def proxy(func): return func(*args, **kwargs) return wrapper• از عملگرهای * و ** در تعریف بسته شدن wrapper استفاده می کند برای جمع آوری تمام آرگومان های موقعیتی و کلیدواژه و ذخیره آنها در متغیرها (args و kwargs). دو مورد قابل توجه در مورد این دکوراتور وجود دارد: • بسته شدن wrapper سپس آرگومان های جمع آوری شده را به آن ارسال می کند تابع ورودی اصلی با استفاده از عملگرهای * و ** “argument un packing”. کمی مایه تاسف است که معنای اپراتورهای ستاره و دو ستاره بیش از حد بارگذاری شده است و بسته به زمینه آنها تغییر می کند. استفاده شده است، اما امیدوارم ایده را گرفته باشید. بیایید تکنیک ارائه شده توسط دکوراتور پروکسی را به روشی بیشتر گسترش دهیم مثال کاربردی مفید در اینجا یک دکوراتور ردیابی است که کارکرد سیاهه های مربوط را دارد آرگومان ها و نتایج در طول زمان اجرا:def wrapper(*args, **kwargs): def trace(func): print(f’TRACE: calling {func.__name__}() ‘ original_result = func(*args, **kwargs) print(f’TRACE: {func.__name__}() ‘ f’with {args}, {kwargs}’) return original_result return wrapperتزئین یک تابع با trace و سپس فراخوانی آن، آرگومان های ارسال شده به تابع تزئین شده و مقدار بازگشتی آن را چاپ می کند. این هنوز هم تا حدودی یک نمونه “اسباب بازی” است – اما در یک خرج کردن بسیار عالی است کمک اشکال زدایی:@trace def say(name, line): f’returned {original_result!r}’) return f'{name}: {line}’ ‘TRACE: calling say() with (“Jane”, “Hello, World”), {}’ ‘TRACE: say() returned “Jane: Hello, World”‘ >>> say(‘Jane’, ‘Hello, World’) ‘Jane: Hello, World’وقتی از یک دکوراتور استفاده می کنید، واقعاً کاری که انجام می دهید جایگزین کردن آن است عملکرد با دیگری یکی از معایب این فرآیند این است که “پنهان می شود” برخی از فراداده های متصل به تابع اصلی (تزیین نشده). چگونه دکوراتورهای «اشکال‌زدایی» بنویسیم لیست با بسته شدن wrapper پنهان می شود:def greet(): به عنوان مثال، نام تابع اصلی، رشته مستند و پارامتر آن return ‘Hello!’ “””Return a friendly greeting.””” decorated_greet = uppercase(greet)اگر سعی کنید به هر یک از متادیتای آن تابع دسترسی داشته باشید، در عوض، بسته بندی هر ابرداده بسته شدن را خواهید دید.’greet’ >>> greet.__name__ >>> greet.__doc__ >>> decorated_greet.__name__ ‘Return a friendly greeting.’ >>> decorated_greet.__doc__ ‘wrapper’ Noneبی دست و پا و چالش برانگیز خوشبختانه یک راه حل سریع برای این وجود دارد: دکوراتور functools.wraps موجود در کتابخانه استاندارد پایتون.این باعث اشکال زدایی و کار با مفسر پایتون می شود

علیرضا بابامرادی

راه آسان‌تری برای ارتباط با کاربران‌مان پیدا کرده‌ایم :) عضویت در کانال

مطالب زیر را حتما بخوانید:

قوانین ارسال دیدگاه در سایت

  • چنانچه دیدگاهی توهین آمیز باشد تایید نخواهد شد.
  • چنانچه دیدگاه شما جنبه ی تبلیغاتی داشته باشد تایید نخواهد شد.
  • چنانچه از لینک سایر وبسایت ها و یا وبسایت خود در دیدگاه استفاده کرده باشید تایید نخواهد شد.
  • چنانچه در دیدگاه خود از شماره تماس، ایمیل و آیدی تلگرام استفاده کرده باشید تایید نخواهد شد.
  • چنانچه دیدگاهی بی ارتباط با موضوع آموزش مطرح شود تایید نخواهد شد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

لینک کوتاه:
0