I've learned. I'll share.

April 28, 2008

Events in Python

I'm a huge fan of the Actor Model . I think that for most applications, it's the best way to do concurrency. As CPUs get more cores, concurrency becomes more important for programmers, and I think the Actor Model will become more important, too.

But, sometimes you need something more light-weight for handling "events". For example, imagine you have some code listening for file changes in a particular directory. What you'd like to do is make an "event" that is "fired" whenever a file change is detected. When fired, there may be a "handler" or "listener" which is notified of the event. That "handler" is ultimately just some code which is executed when the event occurs.

A while ago, I wanted an event system like this for Python. I didn't see anything builtin or any library available, so I decided to write my own. I'd like to share what I created with you.

But first, I want to follow an example through other programming languages to give you an idea of what I was trying to accomplish and how it compares with what's out there. After that, I'll give you my implemenation in Python. Our example will be listening for changes on the file system. We want to keep the "watcher" code decoupled from the rest of the code, so we use events.

The best implementation of events that I've used is in C#, so we'll start there. In C# 1.0, our file watcher would looks something like this:

public delegate void FileChangeHandler(string source_path);

class FileWatcher
{
    public event FileChangeHandler FileChanged;

    public void WatchForChanges()
    {
       ...
       if(FileChanged != null)
       {
          FileChanged(source_path);
       }
       ...
    }
}

class FileChangeLogger
{
    public void OnFileChanged(string source_path)
    {
        Console.WriteLine(String.Format("{0} changed.", source_path));
    }
}

watcher = FileWatcher();
logger  = FileChangeLogger();
watcher.FileChanged += new FileChangeHandler(logger.OnFileChanged);
watcher.WatchForChanges();


It's pretty nice. The best part is at the end, where you can write "watcher.FileChange += ...". But, you need to type the completely useless "new FileChangeHandler", and you also need to wrap it all in a separate FileChangeLogger class. Luckily, in C# 2.0, they added Anonymous Delegates, which makes this much nicer:

watcher.FileChanged += delegate(string source_path)
{
    Console.WriteLine(String.Format("{0} changed.", source_path));
}
And in C# 3.0, they've made it even nicer!
watcher.FileChanged += (source_path => Console.WriteLine(String.Format("{0} changed.", source_path)));
C# 3.0 has an event system that's downright slick, with type-inferencing and everything. I don't think it gets much better than that.

Actually, there is one thing. If there's no handler registered with the event, calling "FileChanged()" will blow up because it sees FileChanged == null until a handler is registered. This means that you have to write "if(Event != null){Event(...):}" every single time you fire the event. Every single time. If you forget, your code will seem to work fine until there's no handler, in which case it will blow up and you'll smack your forhead because you forgot that you have to repeat that line of code every single time you fire an event. I really mean every single time. It's by far the worst wart on an otherwise elgant system. I have no idea why the designers of C# thought this was a good idea. When would you ever want to fire and event and have it blow up in your face?

Anyway, let's try a different programming language, perhaps Java. It has the worst implementation of events I've ever seen. Here's our FileWatcher example:

...

...

Ok, nevermind, I don't have the heart. I can imagine the code full of IListeners, and implementations, and keeping an array of them, and iterating over them, etc, and I just can't do it. I got seriously upset at one useless line in C#. In Java, it's at least 10 times worse. If you really have the stomach for it, go look at http://java.sun.com/docs/books/tutorial/uiswing/events/index.html. To me, it appears that in Java, events are one giant hack around the lack of first-class functions. If Java had first-class functions, none of that nonsense would be necessary.

Now that we've seen a good implementation of events in C# and avoided a bad one in Java, let's make one for Python. I'd rather it be like the C# event system, so let's see what our example would look like:

from Event import Event

class FileWatcher:
    def __init__(self):
        self.fileChanged = Event()

    def watchFiles(self):
        ...
        self.fileChanged(source_path)
        ...

def log_file_change(source_path):
    print "%r changed." % (source_path,)

watcher              = FileWatcher()
watcher.fileChanged += log_file_change

I think that looks pretty good. So what does the implementation of Event look like?


class Event(IEvent):
    def __init__(self):
        self.handlers = set()

    def handle(self, handler):
        self.handler.add(handler)
        return self

    def unhandle(self, handler):
        try:
            self.handlers.remove(handler)
        except:
            raise ValueError("Handler is not handling this event, so cannot unhandle it.")
        return self

    def fire(self, *args, **kargs):
        for handler in self.handlers:
            handler(*args, **kargs)

    def getHandlerCount(self):
        return len(self.handlers)

    __iadd__ = handle
    __isub__ = unhandle
    __call__ = fire
    __len__  = getHandlerCount
Wow. That was pretty short. Actually, this is one of the reasons I love Python. If the language doesn't have a feature, we can probably add it. We just added one of C#'s best features to Python in 26 lines of code. More importantly, we now have a nice, light-weight, easy-to-use event system for Python.

For all of you how like full examples that you can cut and paste, here is one that you can run. Enjoy!


class Event:
    def __init__(self):
        self.handlers = set()

    def handle(self, handler):
        self.handlers.add(handler)
        return self

    def unhandle(self, handler):
        try:
            self.handlers.remove(handler)
        except:
            raise ValueError("Handler is not handling this event, so cannot unhandle it.")
        return self

    def fire(self, *args, **kargs):
        for handler in self.handlers:
            handler(*args, **kargs)

    def getHandlerCount(self):
        return len(self.handlers)

    __iadd__ = handle
    __isub__ = unhandle
    __call__ = fire
    __len__  = getHandlerCount

class MockFileWatcher:
    def __init__(self):
        self.fileChanged = Event()

    def watchFiles(self):
        source_path = "foo"
        self.fileChanged(source_path)

def log_file_change(source_path):
    print "%r changed." % (source_path,)

def log_file_change2(source_path):
    print "%r changed!" % (source_path,)

watcher              = MockFileWatcher()
watcher.fileChanged += log_file_change2
watcher.fileChanged += log_file_change
watcher.fileChanged -= log_file_change2
watcher.watchFiles()

144 comments:

  1. Have you ever seen
    http://pydispatcher.sourceforge.net/ ?
    not so neat interface, though, but has other values.

    ReplyDelete
  2. pydispatcher looks very interesting, but it's not lightweight. The purpose of the event class I wrote is to be very lightweight.

    To do anything more complex usually means you've got concurrency involved, for which this event system isn't good enough. At that point, I think message passing (the Actor Model) is the right technique.

    The application I am working on right now is VERY concurrent, and so there is lots of message passing. But sometimes, I need something more simple. Thus, I use both my Event class and my Actor class, and they've worked quite well together. I'll share the Actor class in another post.

    ReplyDelete
  3. Yes, of course, it's clear that your goals are different from pydispatcher creators ones.
    I think, one of the differences, that affected pydispatcher interface, is that pydispatcher supports many-to-many connections between listening points and listeners, not only one-to-many.
    If you have large app (i.e. with large DOM tree), and you have N delegates and M listeners waiting for any change, you need to have N*M connections between them.
    Of course, you can add one more delegate, but then your code will have to maintain 2 delegates instead of one each time... with pydispatcher, you need just use "Any" option.
    I found this out while thinking if adding neat interface and delegates could add value to django.

    ReplyDelete
  4. I thought this was very helpful. Thanks a lot.

    ReplyDelete
  5. Hi! I really liked your code and I'll use it in my programs. I wanted to include a comment that the code comes from your blog, but I have to ask you if you consider the code useable under GPL/LGPL?

    Thanks,
    Alex

    ReplyDelete
  6. Hey!

    I loved your code and I've used it in a project of mine - thanks!

    However, you have not answered me under what license have you provided it. As I am at the point of releasing my project under GPLv3 I will have to replace your implementation with something else, so please please please tell me the terms under which I can use it.

    Great work - thank you!

    ReplyDelete
  7. Hi,

    i had to add a "return self" to the __iadd__ __isub__ mapped functions to get this to work.

    But i have just started with py, so maybe i overlooked smth.

    ReplyDelete
  8. Finally, I had to drop your code. Anyway, thanks for the great example.

    ReplyDelete
  9. Cool, nicely done. The first time I saw "Java" I had an immediate flashback to all that boilerplate code when I used to write Swing...

    ReplyDelete
  10. This code is clever :) . Thanks for the example

    ReplyDelete
  11. Axel is a library inspired by this example: http://pypi.python.org/pypi/axel

    ReplyDelete
  12. Dude really cool example here .. Thanx alot.

    ReplyDelete
  13. That's a really good code. I've modified it to work in multiprocessing.

    ReplyDelete
  14. See multiprocessing example following your great code here:
    http://rnovitsky.blogspot.co.il/2012/10/python-event-listener-multiprocessing.html

    ReplyDelete
  15. nice example (coming from a c# and java developer). I especially like the java example ;-)

    ReplyDelete
  16. I have read your coding relay very useful python programming language.Thank you for sharing you python coding. Python course in Chennai

    ReplyDelete
  17. This blog awesome and i learn a lot about programming from here.The best thing about this blog is that you doing from beginning to experts level.

    Love from Pprogramming

    ReplyDelete
  18. العاب بنات يحتوي موقعنا على تشكيلة من العاب تلبيس بنات متجددة باستمرار وكل مايتعلق بصنف العاب بنات تلبيس ومكياج والعاب طبخ ومرحبا بكم في العاب تلبيس
    al3ab-banat01
    al3ab cooking

    ReplyDelete
  19. Hi, Great.. Tutorial is just awesome..It is really helpful for a newbie like me.. I am a regular follower of your blog. Really very informative post you shared here. Kindly keep blogging. If anyone wants to become a .Net developer learn from .Net Core Training in Chennai. or learn thru .Net Core Training in Chennai. Nowadays Dot Net has tons of job opportunities on various vertical industry.
    or Es6 Training in Chennai. Nowadays JavaScript has tons of job opportunities on various vertical industry.

    ReplyDelete
  20. Thanks for Kanhasoft is the best Python Web Development Company in India. Hire Dedicated Django Developer over 5 years of experience with affordable rates.

    ReplyDelete
  21. Thanks for the valuable blog.My(https://counfreedise.in/) team thank you for this wonderful blog.

    ReplyDelete
  22. مرحبا بكم مع اجود واحسن العاب مزارع
    التي تجعلك تعيشين داخل العاب المزرعة السعيدة
    و ايضا نمدكم العاب طبخلعاب بنات جديدة و العاب بنات
    ك تعيشين ايام البنت الجميلة ام ان كنتي من محبي وصفات الطبخ بالخصوص فندعوك لزيارة موقع samira tv
    و شكرا لكم

    ReplyDelete
  23. A debt of gratitude is in order for offering this quality data to us. I truly delighted in perusing. Will without a doubt going to impart this URL to my companions.  https://tintuyensinh2012.com

    ReplyDelete
  24. The gathering of certified client/crowd information (emails,names and locality)properly oversaw in a CRM, enables you to keep advertising to them and target future events/item dispatch. stage hire Yorkshire

    ReplyDelete
  25. Very Helpful and informative blog! Keep sharing such blogsSoftware Development Company in India

    ReplyDelete
  26. On the off chance that it is your first time to give the game a shot, ensure that you have a fundamental information of poker as a game.machine learning course

    ReplyDelete
  27. Thanks For Sharing This Post. I like your writing Style. Piumi Hansamali Biography

    ReplyDelete
  28. The holy messenger's declaration caused a sublime festival. This permits us probably some breathing space with regards to commending the introduction of Jesus. Aaron Rodgers

    ReplyDelete
  29. i am browsing this website dailly , and get nice facts from here all the time .

    ReplyDelete
  30. I think it could be more general if you get a football sports activity. ExcelR Data Analyst Course

    ReplyDelete
  31. Nice Blog...
    Thanks For sharing with us.
    by cognex is the AWS Training in Chennai. Cognex offers so many services according to the clients needs.

    ReplyDelete
  32. Dr. Vivek Galani is a leading expert in skin and hair. At hair transplant clinic in Surat Skin Care, Cosmetic Laser, Hair Transplant & Slimming Center, Dr. Galani offers the most advanced cosmetic and dermatologic care treatments. The clinic uses advanced FUE methods to produce high-quality hair transplants.

    ReplyDelete
  33. Shreeja Health Care is leading manufacturer of Oil Maker Machine. Shreeja Oil Extraction Machine is able to extract oil from various seeds like peanuts, Coconut, Sesame, Soybean, macadamia nuts, walnuts, sunflower seeds, vegetable seeds flaxseed etc.

    ReplyDelete
  34. Thanks for sharing this informative content.,
    Leanpitch provides online training in Scrum Master Certification during this lockdown period everyone can use it wisely.
    Join Leanpitch 2 Days CSM Certification Workshop in different cities.

    CSM online

    CSM online certification

    ReplyDelete
  35. Thanks for sharing this informative content.,
    Leanpitch provides online training in Scrum Master Certification during this lockdown period everyone can use it wisely.
    Join Leanpitch 2 Days CSM Certification Workshop in different cities.

    CSM online training

    CSM training online

    ReplyDelete
  36. Thanks for sharing this informative content.,
    Leanpitch provides online training in Scrum Master Certification during this lockdown period everyone can use it wisely.
    Join Leanpitch 2 Days CSM Certification Workshop in different cities.

    CSM training online

    Scrum master training online

    ReplyDelete
  37. i am glad to discover this page : i have to thank you for the time i spent on this especially great reading !! i really liked each part and also bookmarked you for new information on your site.
    data analytics course in patna

    ReplyDelete
  38. Staggeringly generally charming post. I was looking for such information and totally liked assessing this one. Keep posting. A responsibility of thankfulness is all together for sharing…

    AI Training in Hyderabad

    ReplyDelete
  39. It is soo informative. Are you also searching for cheap assignment writing help we are the best solution for you. We are best known for delivering the best services to students without having to break the bank

    ReplyDelete
  40. I want to leave a little comment to support and wish you the best of luck.we wish you the best of luck in all your blogging enedevors
    data science training institute in delhi

    ReplyDelete
  41. Thanks for sharing this.,
    Leanpitch provides online training in Scrum Master, everyone can use it wisely.
    Join Leanpitch 2 Days CSM Certification Workshop in different cities.

    Scrum master certification
    csm certification

    ReplyDelete
  42. I want to leave a little comment to support and wish you the best of luck.we wish you the best of luck in all your blogging enedevors
    data scientist course in faridabad

    ReplyDelete
  43. I like your post. I appreciate your blogs because they are really good. Please go to this website for the Data Science Course: For Data Science Course Data Science course in Bangalore. These courses are wonderful for professionalism.

    ReplyDelete
  44. Excellent content ,Thanks for sharing this .,
    Leanpitch provides online training in CSPO, everyone can use it wisely.

    Product owner certification
    Product owner training

    ReplyDelete


  45. افضل شركة تنظيف مكيفات سبليت
    أفضل طرق التنظيف السليمة والصحيحة افضل شركة تنظيف مكيفات بالرياض تعمل على راحة عملائها حيث النظافة بأحدث اّلات التنظيف بأستخدام أجود أنواع المنظفات الخاصه بالمكيفات .

    شركة تنظيف واجهات زجاج بالرياض

    نحرص في شركة تنظيف شقق بالرياض على تنظيف الشقق وغسل جميع محتوياتها بشكل جيد وبطريقة احترافية من خلال استخدام أقوى المنظفات الآمنة على الممتلكات ولا تؤثر عليها أي تأثير سلبي وبعد الانتهاء من تنظيف الشقة يقوم فريق العمل في شركة تنظيف موكيت بالرياض بترتيبها وتطهيرها بالكامل.

    شركة تنظيف موكيت بالرياض
    نقدم خدماتنا مثل غسيل الموكيت والسجاد وغيرها فالهدف الاول هو راحة العملاء و اكتساب ثقتهم مهما تكلف الامر مع ضمان جودة الخدمات المقدمه و سرعة انجازها بكل سهوله و امان و على احدث و افضل الاساليب.

    ReplyDelete
  46. ترينداوي الأسعار
    هو موقع مختص في تقديم اسعار وعروض المنتجات والخدمات بكافه انواعها

    ReplyDelete
  47. Very informative message! There is so much information here that can help any business start a successful social media campaign!
    data science training in london

    ReplyDelete
  48. I like to view your web site which is very useful and excellent resource and truly adored reading your posting. Thank you!
    Data Science Course in Gurgaon

    ReplyDelete
  49. Very nice job... Thanks for sharing this amazing and educative blog post!
    Data Science Training in Lucknow

    ReplyDelete
  50. I want to leave a little comment to support and wish you the best of luck.we wish you the best of luck in all your blogging enedevors
    data science course delhi

    ReplyDelete
  51. Informative Post. The information you have posted is very useful and sites you have referred was good. Thanks for sharing.
    Data Science Course with Placement

    ReplyDelete
  52. We SVJ Technocoat are the leading Service Provider and Exporter of an extensive array of PVD Coating Service and Vapor Deposition Coating Service etc. We are a well known firm for providing excellent quality coating services across the nation and in a timely manner. Owing to our improvised business models, our professionals are offering integrated solutions for our clients.

    ReplyDelete
  53. You have done a great job and will definitely dig it and personally recommend to my friends. Thank You.
    Data Science Online Training

    ReplyDelete
  54. I want to thank you for your time in this wonderful read which is really appreciable and put you in your favorites to see new things on your blog, a must-have blog!
    Business Analytics Course in Noida

    ReplyDelete
  55. Candela GentleLASE medical grade laser applies precise, controlled pulses of laser. Auckland Laser Hair Removal energy that reach down the hair shaft into the follicle underneath the skin, cauterizing the hair at its root. the encompassing tissue or skin isn’t damaged. The laser’s gentle beam of sunshine damages and consequently prevents the follicle from growing.

    ReplyDelete
  56. Very great post which I really enjoy reading this and it is not everyday that I have the possibility to see something like this. Thank You.
    Best Online Data Science Courses

    ReplyDelete
  57. Very interesting blog and lot of the blogs we see these days don't provide anything that interests me but i am really interested in this one just thought I would post and let you know.
    Data Science Training Institute in Noida

    ReplyDelete
  58. Through this post, I realize that your great information in playing with all the pieces was exceptionally useful. I advise this is the primary spot where I discover issues I've been scanning for. You have a smart yet alluring method of composing.

    ReplyDelete
  59. Nice Post i have read this article and if I can I would like to suggest some cool tips or advice and perhaps you could write future articles that reference this article. I want to know more!
    Data Analytics Course in Gurgaon

    ReplyDelete
  60. Extremely overall quite fascinating post. I was searching for this sort of data and delighted in perusing this one.
    Continue posting. A debt of gratitude is in order for sharing.
    data science training in warangal

    ReplyDelete
  61. This is a great inspiring article. I am pretty much pleased with your good work. You put really very helpful information. Keep it up. Keep blogging. Looking to reading your next post. funny jokes in urdu

    ReplyDelete
  62. Well done for this excellent article. and really enjoyed reading this article today it might be one of the best articles I have read so far and please keep this work of the same quality.
    Data Analytics Course in Noida

    ReplyDelete
  63. RQC is one of the Best Best Hair Clinic In Surat, with services, including Hair Transplant, Hair Treatment, Hairfall and Hair Loss, dermatology. RQC brings you the best services in hair transplant, Hair Treatment.

    ReplyDelete
  64. there is more information I have is very important. Thank you I'm glad you could get
    out of it to share

    wedding photography

    leather jacket

    ReplyDelete
  65. OTOSLOT merupakan Slot Tergacor Pakai Dana yang menyediakan permainan slot terlengkap di indonesia. Kami selaku agen judi slot online yang bersertifikat resmi dari PAGCOR (Philippine Amusement and Gaming Corporation). Kami menyediakan menyediakan permainan super lengkap dalam 1 platform seperti, Permainan Slot, Tembak Ikan, Sabung Ayam, Live Casino, Dindong, Tangkas, E-Spot dan Mini Games Lainya.
    JuliasNetwork menyediakan segala jenis permainan hanya dengan menggunakan 1 User saja dengan minimal deposit 20.000 kamu sudah bisa mainkan semua jenis permainan kesayangan anda hanya di www.otoslot.com.

    ReplyDelete
  66. عرف علي افضل مركز صيانة في الوطن العربي نعمل في صيانة كل البرندات العالمية مثل
    صيانة ثلاجات بوش
    صيانة ديب فريزر بوش

    صيانة سخانات بوش
    أفضل وأوضح طريقة لحل المشكلة هي التحدث مباشرة مع Bosch.

    والمسؤول لديه القدرة على تثبيت المكون الأصلي للجهاز، ومن ثم الوصول إلى الجهاز للحصول على الأداء الأمثل وأعلى جودة.

    ولا يصبح هذا ممكنًا إلا بعد فحص تقني متخصص للأجزاء من قبل مهندسي بوش في شركة Bosch العالمية، الشركة المصنعة للمنتج.

    يحتوي هذا الموقع على جميع متطلبات مستخدمي Bosch الألمان والأجزاء الأصلية والدعم الفني.

    ويتضمن أيضًا إرشادات استخدام المنتج، ومعلومات الضمان لكل محافظة، بالإضافة إلى معدات الكشف عن الأخطاء الحديثة.
    افضل مركز صيانة معتمد

    ReplyDelete
  67. Life directed by David Lynch Transparent sticker

    Size: 5 x 8 inches

    Quantity:1

    Printed on premium vinyl.
    Die cut weather and UV resistant for the best & most durable quality
    Easy to install
    Made so it won't rip paint off your car !

    Ideal for sticking in a window.
    Can also apply to anywhere with clean and flat surface.

    Send us a message for a custom order.

    Visit the rest of our shop to see more Wonderful Stickers ! We will surprise you !


    directed by david lynch window

    ReplyDelete
  68. قام الفنان العالمي ومغني الراب الشهير، إيمينيم بالدخول إلى عالم الرموز غير القابلة للاستبدال واشتري قرد NFT وذلك من خلال شراء رمز غير قابل للاستبدال الذي ينتمي لأحد قرود الملل الشهيرة ليوضح صور nft العديدة والمتحركة.

    صور nft

    ReplyDelete
  69. يتم استخدام الذكاء الاصطناعي أكثر فأكثرفى تحسين جودة الصور. بمساعدة التعلم الآلي يمكن تدريب الخوارزميات على إزالة الخلفية من الصور وتحسين اللون والتباين، وحتى إضافة التفاصيل المفقودة. هذا مفيد بشكل خاص في الحالات التي تكون فيها الصورة الأصلية ذات جودة رديئة أو في حالة متلفة.

    ReplyDelete
  70. صور nft

    وأعلن اللاعب نيمار عبر حسابه
    في تويتر عن كونه عضوًا في نادي يخوت قرود الملل وهو نادي يجذب العديد من المشاهير الذين أصبح لديهم شغف كبير بامتلاك أحد رموز NFTs غير القابلة للاستبدال.

    ReplyDelete
  71. Enroll in the Data Analytics Certification course and outshine in your career. The unmatchable training methodology will allow you to flourish in your career. data analytics course in kanpur

    ReplyDelete
  72. This comment has been removed by the author.

    ReplyDelete
  73. I have bookmarked your website because this site contains valuable information in it. I am really happy with articles quality and presentation. Thanks a lot for keeping great stuff. I am very much thankful for this site. data analytics courses malaysia

    ReplyDelete
  74. ما الفرق بين التهاب المهبل البكتيري والفطري ؟

    تتساءل الكثير من النساء ما هو الفرق بين التهاب المهبل الجرثومي والتهاب المهبل الفطري، لأن حوالي 50٪ من النساء يعانين
    من التهابات أو فطريات مهبلية ويريدن التفريق بينهما للاطمئنان على صحتهن.

    ما هي الالتهابات المهبلية؟
    ما الفرق بين التهاب المهبل البكتيري والفطري
    ما هو الفرق بين التهاب المهبل الجرثومي والتهاب المهبل الفطري؟
    من خلال موقع الخبير سنوف، حاولنا التفريق بين التهاب المهبل الجرثومي والتهاب المهبل الفطري
    من خلال تحديد الالتهابات المهبلية وأنواعها، والتي لا تستطيع العديد من النساء التمييز بينها.

    الالتهابات المهبلية هي اعراض غير طبيعية تظهر عند النساء تجعلهن يشعرن بعدم الراحة والشعور بالغثيان وهذه اهم اسباب هذه الالتهابات المهبلية: -

    يمكن أن تتعرض المرأة للإصابة بعدوى الخميرة، وهي من أهم أنواع الالتهابات المهبلية.
    يعد التعرض الواضح لبكتيريا المهبل التي تسبب الألم وعدم الراحة أحد الأسباب الرئيسية للالتهابات المهبلية.
    عدوى المشعرات عبارة عن مزيج من البكتيريا والفطريات.

    ReplyDelete
  75. Skoda Octavia 4 2019 1.5 TGI G-TEC (130 HP) CNG DSG
    skoda octavia cng 2019

    ReplyDelete
  76. Skoda Octavia 4 Combi 2019 1.5 TSI G-TEC (130 HP) CNG DSG
    octavia cng 2019

    ReplyDelete
  77. تقدم لك شركة ماستر تك احسن ماكينات تعبئة بقوليات نصف اوتوماتيك باسعار متميزة وضمان دوري للصيانة

    ReplyDelete
  78. ينصح دوما افضل دكتور قدم سكري الدكتور محمود ناصر بالاهتمام بالقدمين لمرضي السكري وقص الاظافر بشكل دوري وتنظيف القدم جيداً وتنشيفها جيداً وفي حالة حدوث جرح يجب التوجه فوراً للطبيب المختص المعالج لتجنب القدم السكرية

    ReplyDelete
  79. The Python community usually produces its own documentation for the language. If you want to learn more about Python and the Python programming language, the best way to do this is by reading the official language. I know Little Bit Python Language is easy to use. A little Python has a lot of features and it's easy for students to pick it up. I think students and professionals alike can use it. But In this Post, we'll take a look at how to create an event in python. Thanks For Sharing This post with us.
    Your Reader : Englingua

    ReplyDelete
  80. This comment has been removed by the author.

    ReplyDelete
  81. تعتبر شركة ستار وود اكبر شركة اثاث مكتبي في مصر كل انواع الاثاث المكتبي المختلفة موديلات متنوعة مثل الكلاسيك و المودرن و النيوكلاسيك يتم التصنيع من اجواد الخامات الموجودة في السوق المصري .

    ReplyDelete
  82. I truly adored visiting your post and this content was very unique. Thanks a lot for sharing this...
    Virginia Spousal Support
    Emergency Protective Order

    ReplyDelete
  83. Nice write-up. It is informative to my vision of eyes. I really enjoyed reading it. Keep doing a great job.
    techimply

    ReplyDelete
  84. Start your Data Science Training from anywhere you like with 360DigiTMG, A world-class curriculum, LMS Access, real-time project, and assignments that will help you in bagging a good-paying job. Enroll now!best institute for data science in hyderabad

    ReplyDelete
  85. This comment has been removed by the author.

    ReplyDelete
  86. Are you serching for TikTok SMM panel?
    Here is Best SMM panel for TikTok

    ReplyDelete
  87. Great! I have been looking for this type of post about python. Thank you so much for sharing this blog. best python course in Noida

    ReplyDelete
  88. https://www.linkedin.com/in/khaledzein/

    ReplyDelete
  89. Very informative Article as it had high quality contents to gain more knowledges. Thanks for sharing this
    Traffic Lawyer Henrico VA
    Traffic Lawyer Fairfax VA

    ReplyDelete
  90. An Event is simply an action, like clicking a button, which then leads to another event, which the developer already assigns.

    ReplyDelete
  91. Teachers can quickly view and assess each student’s performance. They may also evaluate each and every learner in a flash.
    introduction of applications in the education sector, major learning techniques have emerged. On mobile apps, there really are fun activities that engage children in a healthy mental system and help them see things from a different perspective.
    Parent-teacher communication apps assist in the development of parent-teacher relationships outside of the classroom. This makes it easier for teachers to reply to parents’ questions about their child’s progress. It also contributes to the educational sector’s openness.
    enables students to access study materials from the comfort of their own homes.
    Data security is facilitated by school app features, which keep contact information, exam papers, and other payment information secret.
    If an important event is going to occur, everyone will be notified via push notifications.
    Parents will have access to their children’s grades in order to keep track of their progress.
    Students will benefit from a tailored learning experience provided by a mobile app for school and university.
    In nutshell, technology plays a pivotal role in transforming the lives of students, teachers, parents, and the nation as a whole. It serves enormous benefits to every stakeholder in the system. Thus it is imperative to adapt to the innovations and upgrades not just for the sake of convenience but for staying competitive in the dynamic world. With the evolving society, every school shall evolve its programs and systems.

    ReplyDelete
  92. "Excellent post! Well-written, insightful analysis with practical examples and engaging style. Informative and enjoyable to read. Looking forward to more content from you. Keep up the great work!" I am a trainer at Softcrayons Tech Solution Pvt Ltd providing Google Analytics Training Noida at an affordable price. Join our training program today to learn from the best in the industry!

    ReplyDelete
  93. Nice post thank you Tonya

    ReplyDelete
  94. I appreciate the way you presented the information and the helpful tips you provided. Keep up the good work
    it definitely gave me some food for thought. Looking forward to reading more from you
    reckless driving virginia
    Reckless Driving Carroll County VA Lawyer

    ReplyDelete

Blog Archive

Google Analytics