سیگنال¶

  • 2022-09-1

جنگو شامل یک "توزیع کننده سیگنال" است که به برنامه های جدا شده کمک می کند هنگام انجام اقدامات در جای دیگر چارچوب مطلع شوند. به طور خلاصه سیگنال ها به فرستنده های خاصی اجازه می دهند مجموعه ای از گیرنده ها را مطلع کنند که اقداماتی انجام شده است. این موارد به ویژه زمانی مفید هستند که بسیاری از قطعات کد ممکن است به رویدادهای مشابه علاقه مند باشند.

به عنوان مثال یک برنامه شخص ثالث می تواند ثبت نام کند تا از تغییرات تنظیمات مطلع شود:

سیگنال های داخلی جنگو به کد کاربر اجازه می دهد از اقدامات خاصی مطلع شود.

شما همچنین می توانید تعریف و ارسال سیگنال های سفارشی خود را. مشاهده تعریف و ارسال سیگنال های زیر.

سیگنال به ظاهر جفت شل, اما می تواند به سرعت به کد است که سخت به درک منجر, تنظیم و اشکال زدایی.

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

گوش دادن به سیگنال ها¶

برای دریافت یک سیگنال, ثبت نام یک تابع گیرنده با استفاده از سیگنال.اتصال () روش. عملکرد گیرنده هنگام ارسال سیگنال فراخوانی می شود. همه توابع گیرنده سیگنال به ترتیب ثبت شده یک به یک فراخوانی می شوند.

  • گیرنده-تابع پاسخ به تماس خواهد شد که به این سیگنال متصل. برای اطلاعات بیشتر به توابع گیرنده مراجعه کنید.
  • فرستنده-فرستنده خاصی را برای دریافت سیگنال مشخص می کند. مشاهده اتصال به سیگنال های فرستنده خاص برای اطلاعات بیشتر ارسال.
  • ضعیف-فروشگاه جنگو گرداننده سیگنال به عنوان مراجع ضعیف به طور پیش فرض. بنابراین اگر گیرنده شما یک عملکرد محلی باشد ممکن است زباله جمع شود. برای جلوگیری از این, تصویب ضعیف=نادرست زمانی که شما اتصال سیگنال پاسخ() روش.
  • راهنمای اعزام-یک شناسه منحصر به فرد برای گیرنده سیگنال در مواردی که ممکن است سیگنال های تکراری ارسال شود. برای اطلاعات بیشتر به جلوگیری از سیگنال های تکراری مراجعه کنید.

بیایید ببینید که چگونه این کار با ثبت یک سیگنال است که می شود به نام بعد از هر درخواست قام به پایان رسید. ما به سیگنال درخواستی متصل خواهیم شد.

توابع گیرنده¶

ابتدا باید یک تابع گیرنده را تعریف کنیم. گیرنده می تواند هر عملکرد یا روش پایتون باشد:

توجه داشته باشید که تابع طول می کشد یک استدلال فرستنده, همراه با استدلال کلمات کلمه کلیدی ( **کوارگز ); همه گرداننده سیگنال باید این استدلال را.

ما در فرستنده کمی بعد نگاه, اما در حال حاضر در نگاه **استدلال کوارگز. همه سیگنال ها استدلال های کلمات کلیدی را ارسال می کنند و ممکن است این استدلال های کلمات کلیدی را در هر زمان تغییر دهند. در مورد درخواست _ به پایان رسید , این به عنوان ارسال هیچ استدلال مستند, که بدان معنی است که ما ممکن است وسوسه به ارسال سیگنال ما دست زدن به عنوان تماس با من(فرستنده) .

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

اتصال توابع گیرنده¶

به دو روش می توانید گیرنده را به سیگنال متصل کنید. می توانید مسیر اتصال دستی را طی کنید:

همچنین می توانید از دکوراتور گیرنده() استفاده کنید:

در اینجا نحوه ارتباط شما با دکوراتور وجود دارد:

اکنون, تابع تماس تلفنی من ما خواهد شد به نام هر زمان یک درخواست پس از اتمام.

از کجا باید این کد زندگی می کنند?

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

در عمل, گرداننده سیگنال معمولا در یک زیر ماژول سیگنال از نرم افزار که مربوط به تعریف. گیرنده های سیگنال به روش () کلاس پیکربندی برنامه شما متصل می شوند . اگر شما با استفاده از گیرنده() دکوراتور, وارد کردن سیگنال های فرعی در داخل اماده (), این به طور ضمنی کنترل کننده سیگنال اتصال:

روش اماده () ممکن است بیش از یک بار در طول تست اجرا شود بنابراین ممکن است بخواهید سیگنال های خود را از تکرار محافظت کنید به خصوص اگر قصد ارسال سیگنال ها را دارید.

اتصال به سیگنال های ارسال شده توسط فرستنده های خاص¶

برخی از سیگنال های دریافت چند بار ارسال, اما شما تنها علاقه مند به دریافت یک زیر مجموعه خاصی از کسانی که سیگنال می شود. برای مثال جنگو را در نظر بگیرید.دسی بل.مدل ها.سیگنال.قبل از ذخیره سیگنال قبل از ذخیره یک مدل ارسال می شود. از زمانی که شما لازم نیست بدانید که هر مدل ذخیره می شود – فقط زمانی که یک مدل خاص ذخیره شده است.

در این موارد می توانید برای دریافت سیگنال های ارسال شده فقط توسط فرستنده های خاص ثبت نام کنید. در مورد جنگو.دسی بل.مدل ها.سیگنال. _ذخیره, فرستنده خواهد بود که کلاس مدل در حال ذخیره, بنابراین شما می توانید نشان می دهد که شما فقط می خواهید سیگنال های ارسال شده توسط برخی از مدل:

تابع _هندلر تنها زمانی فراخوانی می شود که یک نمونه از میمدل ذخیره شود.

برای اطلاعات مربوط به هر سیگنال خاص باید با مستندات سیگنال داخلی مشورت کنید.

جلوگیری از سیگنال های تکراری¶

در برخی شرایط کد اتصال گیرنده ها به سیگنال ها ممکن است چندین بار اجرا شود. این می تواند باعث تابع گیرنده خود را به ثبت نام بیش از یک بار, و در نتیجه به عنوان چند بار برای یک رویداد سیگنال به نام. به عنوان مثال ممکن است روش اماده() بیش از یک بار در طول تست اجرا شود. به طور کلی, این اتفاق می افتد در همه جا پروژه شما ماژول را در جایی که سیگنال ها را تعریف می کنید وارد می کند, زیرا ثبت سیگنال هر چند بار که وارد می شود اجرا می شود.

اگر این رفتار مشکل ساز باشد (مانند استفاده از سیگنال ها برای ارسال ایمیل هر زمان که یک مدل ذخیره شده است) یک شناسه منحصر به فرد را به عنوان استدلال اعزام کنید تا عملکرد گیرنده خود را شناسایی کنید. این شناسه معمولا یک رشته خواهد بود, اگر چه هر شی درهم کفایت خواهد کرد. نتیجه نهایی این است که عملکرد گیرنده شما فقط برای هر مقدار _رسانای منحصر به فرد یک بار به سیگنال متصل می شود:

تعریف و ارسال سیگنال¶

برنامه های شما می توانند از زیرساخت سیگنال استفاده کرده و سیگنال های خاص خود را فراهم کنند.

زمان استفاده از سیگنال های سفارشی

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

تعریف سیگنال ها¶

همه سیگنال ها جنگو.اعزام.نمونه سیگنال.

این یک سیگنال پیتزا را اعلام می کند.

ارسال سیگنال¶

دو راه برای ارسال سیگنال در جنگو وجود دارد.

علامت. ارسال ( فرستنده, * * کوارگز ) [منبع] Sign سیگنال. ارسال (فرستنده, * * کوارگز ) [منبع] ¶

برای ارسال یک سیگنال, پاسخ هم سیگنال.ارسال () (همه سیگنال های داخلی از این استفاده می کنند) یا سیگنال.ارسال _روبوست() . شما باید استدلال فرستنده (که یک کلاس بیشتر از زمان است) فراهم می کند و ممکن است به عنوان بسیاری از استدلال کلمه کلیدی دیگر به عنوان دوست دارید فراهم می کند.

مثلا, در اینجا چگونه ارسال سیگنال پیتزا ما ممکن است نگاه:

هر دو ارسال() و ارسال() بازگشت یک لیست از جفت تاپل [(گیرنده, پاسخ), . ], به نمایندگی از لیستی از توابع گیرنده به نام و ارزش پاسخ خود را.

ارسال () متفاوت از ارسال () در نحوه استثنا مطرح شده توسط توابع گیرنده به کار گرفته می شوند. ارسال () هیچ استثنایی مطرح شده توسط گیرنده گرفتن نیست; این به سادگی اجازه می دهد تا اشتباهات به انتشار. بنابراین ممکن است همه گیرنده ها در برابر خطا از سیگنال مطلع نشوند.

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

ردیابی ها در __ردیابی__ ویژگی خطاهای برگشتی هنگام تماس وجود دارد ارسال روباست() .

قطع سیگنال ها¶

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

استدلال گیرنده گیرنده ثبت شده را برای قطع ارتباط نشان می دهد. ممکن است هیچ کدام نباشد اگر از مایع اعزام برای شناسایی گیرنده استفاده شود.

ثبت دیدگاه

مجموع دیدگاهها : 0در انتظار بررسی : 0انتشار یافته : ۰
قوانین ارسال دیدگاه
  • دیدگاه های ارسال شده توسط شما، پس از تایید توسط تیم مدیریت در وب منتشر خواهد شد.
  • پیام هایی که حاوی تهمت یا افترا باشد منتشر نخواهد شد.
  • پیام هایی که به غیر از زبان فارسی یا غیر مرتبط باشد منتشر نخواهد شد.