<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">On Apr 19, 2015, at 12:06 PM, Yury Selivanov <<a href="mailto:yselivanov.ml@gmail.com" class="">yselivanov.ml@gmail.com</a>> wrote:<div class=""><br class=""><div><blockquote type="cite" class="">On 2015-04-19 2:52 PM, Antoine Pitrou wrote:<br class=""><div class=""><blockquote type="cite" class="">On Sun, 19 Apr 2015 14:44:00 -0400<br class="">Yury Selivanov <<a href="mailto:yselivanov.ml@gmail.com" class="">yselivanov.ml@gmail.com</a>><br class="">wrote:<br class=""><blockquote type="cite" class="">Queries in __getattr__<br class="">are bad because of many reasons.<br class=""></blockquote>If you think they are bad, it means you probably don't like ORMs, since<br class="">that's a primary feature of theirs.<br class=""></blockquote>I don't like that particular "feature" of most popular ORMs<br class="">available today.</div></blockquote><br class=""></div></div><div>Our personal likes aside, one of asyncio’s design goals was to disallow implicit yield points. This is a philosophical decision going back to PEP 20 and the attribute/method distinction in Python. As opposed to, say, Ruby and its Uniform Access Principle, in Python users expect obj.thing to be instant, as opposed to obj.get_thing(), which might take a non-trivial amount of time.</div><div><br class=""></div><div>In asyncio this is even more important since exclusively explicit yield points enable the user to reason about concurrency and thus the correctness of the implementation. As long as you’re not yielding, you are guaranteed* the global state of your thread is not going to mutate under your feet (signals and cancellations not-withstanding).</div><div><br class=""></div><div>Yes, it’s true that we can’t replicate the current SQLAlchemy API in a performant way in asyncio. As far as I understand, we don’t want to. That being said, you *can* implement ORMs with explicit DB communication. FWIW, it looks like it would be easier to modify the Django ORM’s API to work with asyncio.</div><br class=""><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">-- <br class="">Lukasz Langa | Facebook<br class="">Production Engineer | Global Consistency <br class="">(+1) 650-681-7811</div></div>
</div>
<br class=""></body></html>