I've learned. I'll share.

December 31, 2007

Immutable Data in Python (Record or Named Tuple)

A valued lesson that I have learned the hard way is that mutable data can get nasty, and that it's really nice to have immutable data structures. I've been writing a lot of python recently, and after a while I realized that I was writing a lof of this:

class SomeDataStructure:
    def __init__(self, arg1, arg2):
        self.prop1 = arg1
        self.prop2 = arg2

Not only was this repetitive, but I found that little mutability bugs were cropping up on me. It's just too easy to trip over them when the default is mutability, as it is in python. In fact, immutable data structures aren't even a built-in option in python.

Finally the pain of using mutable data structures grew too large. I looked for a way and couldn't find anything, so I created my own. It supports getters, setters, inheritance, default values, altering several values at once, and I think the syntax is nice. I've been using it for everything the last few months and it's been great. It's helped with code repetition, concurrency, and serialization.

I hope you can learn from my valued lesson and not repeat my mistakes. Here's how you use it.

class Person(Record("name", "age")):
    pass

class OldPerson(Person):
    @classmethod
    def prepare(cls, name, age = None):
        return (name, age)

peter   = Person("Peter", 26)
wes     = Person("Wes", 28)
grandpa = OldPerson("Bubba")
wes2    = wes.setAge(29)
wes3    = wes.alter(name = "Grandpa", age = 57)
print peter, grandpa, wes.name, wes2.age

Here is the code. This is actually a simplified version of the original that I rewrote on my own time. I use a more comlete/complex version in the code I'm writing for my employer.

def Record(*props):
    class cls(RecordBase):
        pass

    cls.setProps(props)

    return cls

class RecordBase(tuple):
    PROPS = ()

    def __new__(cls, *values):
        if cls.prepare != RecordBase.prepare:
            values = cls.prepare(*values)
        return cls.fromValues(values)

    @classmethod
    def fromValues(cls, values):
        return tuple.__new__(cls, values)

    def __repr__(self):
        return self.__class__.__name__ + tuple.__repr__(self)

    ## overridable
    @classmethod
    def prepare(cls, *args):
        return args

    ## setting up getters and setters
    @classmethod
    def setProps(cls, props):
        for index, prop in enumerate(props):
            cls.setProp(index, prop)
        cls.PROPS = props

    @classmethod
    def setProp(cls, index, prop):
        getter_name = prop
        setter_name = "set" + prop[0].upper() + prop[1:]

        setattr(cls, getter_name, cls.makeGetter(index, prop))
        setattr(cls, setter_name, cls.makeSetter(index, prop))

    @classmethod
    def makeGetter(cls, index, prop):
        return property(fget = lambda self : self[index])

    @classmethod
    def makeSetter(cls, index, prop):
        def setter(self, value):
            values = (value if current_index == index
                            else current_value
                      for current_index, current_value
                      in enumerate(self))
            return self.fromValues(values)
        return setter

For comparison, I've seen similar ideas at http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/500261 and http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/303439 but I don't like their implementation or design as much, especially since they lack proper setters.

I've also read that future versions of Python will have NamedTuples, which is something I wish it had already.

107 comments:

  1. Isn't a bit of a shame to have to declare a new class for each optional parameters ?

    I would love to have something like the Erlang record.

    -record(person, {name, age, title='Sir'}).

    Then I can create, update or read records using pattern matching.

    Can I get something close in Python ?

    Thanks for your help.

    ReplyDelete
  2. You don't have to declare a new record for optional values. I could have put the prepare method on the original Person record. I just wanted to show optional values and inheritance at the same time. They can be done separately.

    Tuples is the closest thing that you can get to pattern matching in python, and since these records are tuples, you at least get this:


    def reversed_name((name, age)):
    return reversed(name)

    assert reversed_name(Person("peter", 26)) == "retep"

    I'm sorry about the formatting. Does anyone know how to put code in comments in a decent way?

    ReplyDelete
  3. Why not subclass tuple directly? You could make it only accept a fixed number of values and add get/set methods for the named fields corresponding to the indices in the underlying tuple.

    pierre r: You could create a method-less class in Python to get the same sort of behavior. That would basically give you a C-style struct.

    ReplyDelete
  4. Nice piece of code! In your examples there is a reference to a missing alter method, here is a simple implementation following your code's logic:

    def alter(self, **values):
    new_values = \
    (values[key] if values.has_key(key) else self[index]
    for index,key in enumerate(self.PROPS))
    return self.fromValues(new_values)

    ReplyDelete
  5. omg, for which reason you do this?

    why not just
    class Person(object):
    __immutable = ('age', )
    age = None
    name = None

    def __setattr__(self, name, value):
    if name in self.__immutable:
    raise Exception('%s is immutable of %r' % (name, self))
    super(Person, self).__setattr__(name, value)

    or something like that. Much less overheat in setters/getters, coz you create separate function for EACH property.

    ReplyDelete
  6. I prefer just using a simple struct.

    class Struct:
    def __init__(self, **entries): self.__dict__.update(entries)

    >>> me = Struct(name='Homer Simpson', age=40)
    >>> me.age
    40
    >>> me.name = 'Max Power'
    >>> vars(me)
    {'age': 40, 'name': 'Max Power'}

    Though I am biased against getter/setter methods and am convinced they are evil and definitely un-pythonic. But that's another story...

    ReplyDelete
  7. We will discuss here about valued lessons and spend our lives in a good manner. If we adopt good strategy, we will enjoy our life. So, learn a good lesson about life and enjoy a successful life. Coursework writing services.

    ReplyDelete
  8. Anyone can attempt writing on your behalf, however, the question is would you pay someone to do it for you without checking their credibility? Our firm has established itself as the most trustworthy assignment help firm in Australia and globally. Join these thousands of students and achieve high distinction in each and every one of your college tasks. This is the main reason why most students search for online assignment help over the internet and choose only the most proficient and trusted academic writing experts. So, if you are searching for quality assignment help usa you can find it right here from the local experts.

    ReplyDelete
  9. Learning python language is not a piece of cake but your selected lesson can make this intimidating task a lit bit easy. Your suggested lesson is effective to create immutable data structures. Thanks for this valuable information. Assignment Writing Service

    ReplyDelete
  10. Excellent Blog! I would like to thank for the efforts you have made in writing this post. Assignment Paraphrasing Services Uk

    ReplyDelete
  11. I always like your article because you have provide every time informative post. Thanks! G.I Joe Cobra Commander Costume

    ReplyDelete
  12. Our advanced and patent shopify app developer software system is excellent for Microsoft Dynamics

    ReplyDelete
  13. We offer Next Gen SIEM and bespoke ids/ips Services that comes with built-in support for most national and international compliance standards

    ReplyDelete
  14. freelance time tracking software to help you to save your precious time

    ReplyDelete
  15. I was very happy to find this site. I really enjoyed reading this article today and think it might be one of the best articles I have read so far. I wanted to thank you for this excellent reading !! I really enjoy every part and have bookmarked you to see the new things you post. Well done for this excellent article. Please keep this work of the same quality.
    Data Science Course in Bangalore

    ReplyDelete
  16. Wow, happy to see this awesome post. I hope this think help any newbie for their awesome work and by the way thanks for share this awesomeness, i thought this was a pretty interesting read when it comes to this topic. Thank you..
    Artificial Intelligence Course

    ReplyDelete
  17. Excellent Blog! I would like to thank you for the efforts you have made in writing this post. Gained lots of knowledge.
    Data Analytics Course

    ReplyDelete
  18. What an incredible message this is. Truly one of the best posts I have ever seen in my life. Wow, keep it up.
    AI Courses in Bangalore

    ReplyDelete
  19. Awesome article. I enjoyed reading your articles. this can be really a good scan for me. wanting forward to reading new articles. maintain the nice work!
    Data Science Courses in Bangalore

    ReplyDelete
  20. I am sure it will help many people. Keep up the good work. It's very compelling and I enjoyed browsing the entire blog.
    Business Analytics Course in Bangalore

    ReplyDelete
  21. Hello there! Nice article!!! But anyways here’s one of the trusted online baccarat site we can offer you so many promo and event everyday!! 한국야동닷컴

    ReplyDelete
  22. This is very interesting, You're a very skilled blogger.
    I've joined your feed and look forward to seeking more of your great post. Also, I have shared your web site in my social networks!
    중국야동넷

    ReplyDelete
  23. Great web site you have got here.. It’s hard to find quality writing like yours these days. I really appreciate individuals like you! Take care!! 파워볼 하는법

    ReplyDelete
  24. Good write-up, I am normal visitor of one抯 web site, maintain up the nice operate, and It is going to be a regular visitor for a lengthy time. 온라인경마

    ReplyDelete
  25. Great job for publishing such a beneficial web site
    바카라사이트

    ReplyDelete
  26. I do agree with all of the ideas you’ve presented in your post.
    카지노사이트

    ReplyDelete
  27. Hard to ignore such an amazing article like this. You really amazed me with your writing talent. Thank you for sharing again.
    토토

    ReplyDelete
  28. This is really helpful post and very informative there is no doubt about it.
    바카라사이트

    ReplyDelete
  29. I need to thank you for this very good read and i have bookmarked to check out new things from your post. Thank you very much for sharing such a useful article and will definitely saved and revisit your site.
    Data Science Course

    ReplyDelete
  30. Your site is truly cool and this is an extraordinary moving article and If it's not too much trouble share more like that. Thank You..
    Digital Marketing Course in Hyderabad

    ReplyDelete
  31. Thank a lot. You have done excellent job. I enjoyed your blog . Nice efforts
    Data Science Certification in Hyderabad

    ReplyDelete
  32. These type of articles keeps the users interest in the website. I found this one pretty fascinating and it should go into my collection. I am Impressed. Please keep going to write more content… 토토

    ReplyDelete
  33. Before Commenting, I wanna say thank you for providing this great information. I feel too good to read it this awesome blog. Keep sharing this type of content. 경마사이트

    ReplyDelete
  34. We have read your blog. It was really informative and we have collected much knowledge that has assisted me a lot. People can also visit our website… 온라인카지노

    ReplyDelete
  35. I was very interested in the article. it’s quite inspiring I should admit. I like visiting you site since I always come across interesting articles like this one. 토토

    ReplyDelete
  36. Here we provide technical HELP for 123.com.setup, driver download, wireless setup, USB setup, and solutions for your HP printer related issues.

    ReplyDelete
  37. Nice blog! Really thank you for your knowledge of the phyton language and other symbols. If to be honest with me I did not strong at converting symbols and writing on phyton language and how to convert a picture in such a way that it would be transformed into a scheme or for example diagram or graph and it is quite complicated for me to write on such language, but I should do it because have such academic course at the university, so use freshessay writing agency as landing help.

    ReplyDelete
  38. 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.

    Scrum master certification online

    CSM certification online

    CSM online

    CSM online certification

    CSM online training

    CSM training online

    Scrum master training online

    ReplyDelete
  39. I bookmarked your website because this site contains valuable information. I am very satisfied with the quality and the presentation of the articles. Thank you so much for saving great things. I am very grateful for this site.

    Data Science Training in Bangalore

    ReplyDelete
  40. I have voiced some of the posts on your website now, and I really like your blogging style. I added it to my list of favorite blogging sites and will be back soon ...

    Digital Marketing Training in Bangalore

    ReplyDelete
  41. I found Habit to be a transparent site, a social hub that is a conglomerate of buyers and sellers willing to offer digital advice online at a decent cost.

    Artificial Intelligence Training in Bangalore

    ReplyDelete
  42. Truly incredible blog found to be very impressive due to which the learners who go through it will try to explore themselves with the content to develop the skills to an extreme level. Eventually, thanking the blogger to come up with such phenomenal content. Hope you arrive with similar content in the future as well.

    Machine Learning Course in Bangalore

    ReplyDelete
  43. I feel very grateful that I read this. It is very helpful and very informative and I really learned a lot from it.
    Best Data Science courses in Hyderabad

    ReplyDelete
  44. Hi, yeah this article is actually pleasant and I have learned lot of things from
    it regarding blogging. thanks.
    카지노사이트

    ReplyDelete
  45. I will recommend your website to everyone. You have a very good gloss. Write more high-quality articles. I support you. 카지노사이트

    ReplyDelete
  46. We are truly thankful for your blog entry. You will discover a ton of approaches subsequent to visiting your post. Incredible work 에볼루션카지노

    ReplyDelete
  47. 파워볼 Super interesting discussion. Thank you for the great comments.

    ReplyDelete
  48. This is what i call , great article website that i have read . hope i can do same as this 경마사이트

    ReplyDelete
  49. This is a great post and enjoy the look of your blog very much. Thanks for sharing. 릴게임

    ReplyDelete
  50. Very appreciated post. Thank you for sharing this post with us. 토토사이트

    ReplyDelete
  51. Thank you so much for giving everyone such a splendid opportunity to discover important secrets from this site.
    It is always very sweet and full of fun for me personally and my office colleagues to
    visit your blog minimum thrice in a week to see the fresh guidance you will have.
    And definitely, I'm so always amazed for the fabulous creative
    ideas served by you. Some two points in this posting are absolutely the most effective we've had.

    Visit my site :: 안마

    ReplyDelete
  52. 카지노 I am really thankful to you for sharing such useful info.
    Hope you are sharing the same in future.
    thanks

    ReplyDelete
  53. 카지노사이트 I was able to find good information from your content.

    ReplyDelete
  54. Your style is really unique in comparison to other people I have read stuff from. Many thanks for posting when you have the opportunity, Guess I’ll just bookmark this web site.| v스포츠토토

    ReplyDelete
  55. 토토 Aw, this was a very nice post. Taking a few minutes and actual effort to make
    a very good article… but what can I say… I put things off a whole lot and don’t
    manage to get nearly anything done.

    ReplyDelete
  56. That is a really good tip especially to those fresh to the blogosphere.
    부산오피

    ReplyDelete
  57. If you are going for most excellent contents like me, simply go to see
    this site every day for the reason that it presents quality contents, thanks

    Please Visit My homepage ➤ 안마

    (freaky)

    ReplyDelete
  58. Remarkable! Its in fact amazing post,Really looking forward to read more.바카라사이트

    ReplyDelete
  59. Your information was very useful. I m very pleased to read this article.온라인바둑이

    ReplyDelete
  60. I do trust all of the ideas you have introduced on your post. They’re very convincing and can definitely work. Nonetheless, the posts are too brief for newbies. Could you please extend them a bit from subsequent time? Thank you for the post.
    카지노사이트

    ReplyDelete
  61. Great to become visiting your weblog once more, it has been a very long time for me. Pleasantly this article i've been sat tight fosuch a long time. I will require this post to add up to my task in the school, and it has identical subject along with your review. Much appreciated, great offer. data science course in nagpur

    ReplyDelete
  62. Damn, I've been looking for information like this for a while now. Thanks! 토토

    ReplyDelete
  63. You made some good points there. I did a Google search about the topic and found most people will believe your blog. 파워볼게임

    ReplyDelete
  64. Youre so right. Im there with you. Your weblog is definitely worth a read if anyone comes throughout it. Im lucky I did because now Ive received a whole new view of this. 온라인카지노

    ReplyDelete
  65. Wohh exactly what I was looking for, appreciate it for posting . I truly appreciate your post. Great site! 카지노

    ReplyDelete
  66. 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 analytics course in delhi

    ReplyDelete
  67. I have recently started a web site, the information you offer on this web site has helped me tremendously. Thanks for all of your time & work. 토토

    ReplyDelete
  68. I like what you guys are usually up too. This kind of clever work and coverage! Keep up the very good works guys I’ve incorporated you guys to blogroll.
    온라인바카라

    ReplyDelete


  69. Hey friend, it is very well written article, thank you for the valuable and useful information you provide in this post. Keep up the good work! FYI, please check these depression, stress and anxiety related articles:
    Essay on Neeraj Chopra , The Alchemist book review

    ReplyDelete
  70. you actually make it look so easy together with your performance but i find this remember to be absolutely some thing which i assume i would in no way realize. It seems too complicated and extremely large for me. I’m searching forward on your next publish, i’ll try to get the cling of it! That is one of these super useful resource that you are offering and you provide it away totally free. I like seeing blog that apprehend the cost. Im glad to have located this publish as its such an interesting one! I'm continually looking for great posts and articles so i suppose im lucky to have discovered this! I am hoping you'll be adding extra inside the future. Greetings, there’s no question that your internet website ought to possibly be having browser compatibility problems. On every occasion i take a look at your weblog in safari, it seems first-class but while opening in internet explorer, it’s were given a few overlapping troubles. I simply desired to offer you a brief heads up! Apart from that, high-quality web site! 토토사이트

    ReplyDelete
  71. I as well believe thence , perfectly pent post! Youre so cool! I dont suppose Ive read something such as this before. So nice to seek out somebody by incorporating authentic ideas on this subject. realy i appreciate you for starting this up. this excellent website are some things that’s needed online, somebody after a little bit originality. helpful work for bringing something new to the web! You really should take part in a tournament for starters of the best blogs on-line. I am going to recommend this great site! Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post. 메이저놀이터

    ReplyDelete
  72. Howdy! This is kind of off topic but I need some advice from an established blog. Is it very difficult to set up your own blog? I’m not very techincal but I can figure things out pretty fast. I’m thinking about setting up my own but I’m not sure where to begin. Do you have any ideas or suggestions? Appreciate it . nice info thanks This is nice and awesome thanks for share us.Fantastic Blog…I will definitly share your blog with other people.Thank . I just couldn't leave your website before telling you that I truly enjoyed the top quality info you present to your visitors? Will be back again frequently to check up on new posts. 토토사이트조회

    ReplyDelete
  73. his is an awesome motivating article. I am practically satisfied with your great work. You put truly extremely supportive data. Keep it up. Continue blogging. Hoping to perusing your next post . Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work. Youre so cool! I dont suppose Ive learn anything like this before. So good to find someone with some unique thoughts on this subject. realy thank you for beginning this up. this website is one thing that’s wanted on the web, someone with a bit originality. helpful job for bringing one thing new to the web! 토토사이트

    ReplyDelete
  74. "Very nice post. I just stumbled upon your blog and wished to say that I have truly enjoyed surfing around your blog posts. In any case I’ll be subscribing to your feed and I hope you write again soon! Good day! I simply wish to give a huge thumbs up for the great data you’ve got here on this post. I will probably be coming again to your weblog for more soon. it's extremely cool blog. Connecting is exceptionally valuable thing.you have truly made a difference .
    Excellent information providing by your Article thank you for taking the time to share with us such a nice article." 메이저사이트

    ReplyDelete
  75. Very nice blog and articles. I am really very happy to visit your blog. Now I am found which I actually want. I check your blog everyday and try to learn something from your blog. Thank you and waiting for your new post . This post is good enough to make somebody understand this amazing thing, and I’m sure everyone will appreciate this interesting things. Extremely decent blog and articles. I am really extremely glad to visit your blog. Presently I am discovered which I really need. I check your blog regular and attempt to take in something from your blog. Much obliged to you and sitting tight for your new post. 엔트리파워볼

    ReplyDelete
  76. I simply couldn’t go away your website before suggesting that I actually enjoyed the standard information an individual provide on your visitors? Is gonna be back frequently in order to inspect new posts. I found your blog via Google while searching for first aid for a heart attack and your post looks very interesting for me. This is my first visit to your blog! We are a team of volunteers and starting a new project in a community in the same niche. Great post however , I was wanting to know if you could write a litte more on this subject? I’d be very thankful if you could elaborate a little bit further. Bless you! 먹튀검증

    ReplyDelete
  77. "I am always searching online for articles that can help me. There is obviously a lot to know about this. I think you made some good points in Features also. Keep working, great job! Its a great pleasure reading your post.Its full of information I am looking for and I love to post a comment that ""The content of your post is awesome"" Great work.
    Very cool! I really like the content, good information and good news like this. Bringing up books . I genuinely like you're making style, inconceivable information, thankyou for posting . Thank you for sharing this amazing piece of content. You are doing a great job, thanks for it." 먹튀폴리스주소

    ReplyDelete
  78. It is excellent to look that some people nevertheless recognize how to write a quality post.! Hi there there, you've got finished an fantastic task. I’ll absolutely digg it and for my part suggest to my buddies. I’m assured they’ll be benefited from this internet site. This could be amazing plus meanful. This can be interesting website online. Main is as a substitute on hand detail. You can have significantly made it less complicated for many folks who appear to take a look at site and deliver those oldsters usefull records and statistics. that is my first time i go to here. I discovered so many enticing stuff in your blog, specifically its conversation. From the big loads of remarks in your articles, i surmise i'm through all account no longer the simplest one having all the endeavor here! 사설토토

    ReplyDelete
  79. You really have fantastic stories. Cheers for sharing with us your blog. I would really like to thank you for the efforts you’ve installed penning this internet web page. I'm hoping the equal excessive-grade site post from you in the imminent additionally. Simply your innovative writing competencies has stimulated me to get my own weblog now. Actually the running a blog is spreading its wings fast. Your write up is a excellent instance of it. Exquisite submit! I'm virtually on the point of across this records, is very beneficial my friend. I really like evaluation desires which understand the price of passing at the notable strong asset futile out of pocket. I virtually worshiped inspecting your posting. Grateful to you! Commonplace visits recorded right here are the most honest method to fee your power, that's the motive why i'm keeping off to the website everyday, hunting down new, fascinating records. Many, bless your heart! I discovered your this publish whilst taking a gander at for some associated facts on blog search... It's a not all that horrendous publish.. 먹튀검증

    ReplyDelete
  80. Thanks for writing such amazing content. Your ideas help me every time I read it to work easily and calmly. I like to spend my free time reading your Blogs and learning new things from it. I want to appreciate your work. Good Job. Your writing includes a creative idea that is useful for me as a reader. Your information is amazing and original and attracts readers who love reading such articles like that. You can impress a person with your writing skills. We want to read your more blogs with some more creativity. Your content that you have posted here is fantastic that will not confuse the person but surely impress and attract the readers. 먹튀검증

    ReplyDelete
  81. Very interesting subject, appreciate it for posting.
    click me here바카라
    ( wep )

    ReplyDelete
  82. You uploaded a wonderful write-up. I was extremely touched after I saw your writing, as well as I actually suched as the tale of what I was seeking due to the fact that it included whatever. I'm so interested concerning exactly how you considered this info as well as just how you located it. Take a look at my writing as well as let me understand. 바카라사이트

    ReplyDelete
  83. I'm an extremely fortunate guy today. After seeing your writing, I saw such excellent info as well as my expertise increased also better. I assume I will certainly have the ability to invest a delighted day in your Deokbook. I wish you have a pleased day also. I will certainly constantly sustain you. 바카라사이트

    ReplyDelete
  84. I am always searching online for articles that can help me. There is obviously a lot to know about this. I think you made some good points in Features also. Keep working, great job
    고스톱사이트

    ReplyDelete
  85. You there, this is really good post here. Thanks for taking the time to post such valuable information. Quality content is what always gets the visitors coming.
    스포츠토토

    ReplyDelete
  86. Wow! Such an amazing and helpful post this is. I really really love it. It's so good and so awesome. I am just amazed. I hope that you continue to do your work like this in the future also.
    일본야동

    ReplyDelete
  87. Positive site, where did u come up with the information on this posting? I'm pleased I discovered it though, ill be checking back soon to find out what additional posts you include.
    토토사이트

    ReplyDelete
  88. Wonderful illustrated information. I thank you about that. No doubt it will be very useful for my future projects. Would like to see some other posts on the same subject! Feel free to visit my website; 온라인카지노

    ReplyDelete
  89. Wow, incredible blog format! How lengthy have you been blogging for? you make running a blog glance easy. The full glance of your site is fantastic, as smartly the content material. Feel free to visit my website; 온라인카지노

    ReplyDelete
  90. I love your blog.. very nice colors & theme. Did you create this website yourself or did you hire someone to do it for you? Plz reply as I'm looking to create my own blog and would like to find out where u got this from. thanks a lot. Feel free to visit my website; 바카라사이트

    ReplyDelete
  91. Fantastic post! Please keep sharing. I know of a roofing company if you are looking for Game Please get in touch! Thanks, have a good day. Feel free to visit my website; 온라인카지노

    ReplyDelete
  92. I have read your blog it is very helpful for me. I want to say thanks to you. I have bookmark your site for future updates.
    온라인슬롯

    >wep<

    ReplyDelete
  93. I feel very grateful that I read this. It is very helpful and very informative and I really learned a lot from it.
    Data Analytics Course

    ReplyDelete
  94. What an incredible message this is. Truly one of the best posts I have ever seen in my life. Wow, keep it up.
    AI Courses in Bangalore

    ReplyDelete
  95. I am sure it will help many people. Keep up the good work. It's very compelling and I enjoyed browsing the entire blog.
    Business Analytics Course in Bangalore

    ReplyDelete
  96. I am really enjoying reading your well written articles. I am looking forward to reading new articles. Keep up the good work.
    Data Science Courses in Bangalore

    ReplyDelete
  97. I enjoy each of the perform that you have placed into this. I’m sure that you will be making a really useful place. I has been additionally pleased. Good perform! 인천오피

    ReplyDelete
  98. We are really grateful for your blog post. You will find a lot of approaches after visiting your post. Great work 벳페어토토

    ReplyDelete
  99. I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post. 넷마블가입코드

    ReplyDelete
  100. Interesting topic for a blog. I have been searching the Internet for fun and came upon your website. Fabulous post. Thanks a ton for sharing your knowledge! It is great to see that some people still put in an effort into managing their websites. I'll be sure to check back again real soon. 토토사이트

    ReplyDelete
  101. I feel a lot more people need to read this, very good info!  메이저사이트

    ReplyDelete
  102. Even in this condition, you are looking so cute and beautiful. Always keep that smile on your face. It indicates your confidence. I think that doggie is your best friend. He looks smart. Share your emotions with others you love. It will be a great relief for you.
    고스톱

    ReplyDelete
  103. This was a very motivational post. I wish you all the luck. Get well soon my dear. God is with you. Happy to know that you are getting better day by day and feeling happy. Stay blessed..!!
    스포츠토토

    ReplyDelete
  104. As I website possessor I believe the content matter here is rattling great , appreciate it for your hard work. You should keep it up forever! Best of luck.
    한국야동

    ReplyDelete
  105. Undeniably believe that which you stated. Your favorite reason appeared to be on the net the simplest thing to be aware of. I say to you, I certainly get annoyed while people consider worries that they plainly do not know about. You managed to hit the nail upon the top as well as defined out the whole thing without having side effect , people can take a signal. Will likely be back to get more. Thanks
    토토사이트

    ReplyDelete

Blog Archive

Google Analytics