<div dir="ltr"><span style="font-size:small">I'm sure y'all are too busy with PyCon to be checking email. But if you're curious, I added attribute unpacking and post-binding guards</span><span style="line-height:1.5;font-size:small"> (</span><a href="https://github.com/selik/destructure" style="line-height:1.5;font-size:small">https://github.com/selik/destructure</a><span style="line-height:1.5;font-size:small">).</span><div><span style="line-height:1.5;font-size:small"><br></span></div><div><span style="line-height:1.5;font-size:small">The object unpacking works as most folks have suggested, via kwargs.</span></div><div><span style="font-size:small;line-height:1.5">The guards unfortunately need to be functions that take no parameters.</span><br></div><div><span style="font-size:small;line-height:1.5"><br></span></div><div><div><span style="line-height:1.5">    match(schema=</span><span style="line-height:1.5;font-size:small">Foo(a=1, b=bind.x)</span><span style="line-height:1.5">, data=Foo(a=1, b=2), lambda : bind.x > 0)</span><br></div><br class="inbox-inbox-Apple-interchange-newline"></div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, May 28, 2016 at 6:26 AM Paul Moore <<a href="mailto:p.f.moore@gmail.com">p.f.moore@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 28 May 2016 at 08:22, Michael Selik <<a href="mailto:michael.selik@gmail.com" target="_blank">michael.selik@gmail.com</a>> wrote:<br>
> My original dict unpacking proposal was very short and lacked a motivating<br>
> usage. Toy examples made my proposal look unnecessarily verbose and<br>
> suggested obvious alternatives with easy current syntax.<br>
><br>
> Nested/recursive unpacking is much more troublesome, especially when<br>
> combined with name-binding. I wrote an example to compare my proposal with<br>
> current syntax.<br>
><br>
> Example usage.<br>
> <a href="https://github.com/selik/destructure/blob/master/examples/fips.py" rel="noreferrer" target="_blank">https://github.com/selik/destructure/blob/master/examples/fips.py</a><br>
><br>
> Implementation.<br>
> <a href="https://github.com/selik/destructure/blob/master/destructure.py" rel="noreferrer" target="_blank">https://github.com/selik/destructure/blob/master/destructure.py</a><br>
><br>
> The design of my module I'm least happy with is the name-binding. I extended<br>
> a SimpleNamespace to create an Erlang-style distinction between bound and<br>
> unbound names. Though the API is a bit awkward, now that the module is<br>
> built, I'm less enthusiastic about introducing new syntax. Funny how that<br>
> works.<br>
><br>
> I haven't yet decided how to add post-binding guards to the cases.<br>
<br>
Interesting! Thanks for taking the time to make a real-world use case.<br>
I haven't looked at the module yet, just the example, but the code<br>
does look pretty clean and readable. The example is certainly complex<br>
enough that I'd probably end up with pretty messy and fragile code if<br>
I just tried to put something together with pure Python code.<br>
<br>
And yes, it's interesting how finding a good API for a module can make<br>
the need for a dedicated syntax less pressing. But working out that<br>
good API can be really hard (I don't think I'd ever have thought of<br>
doing it the way you did).<br>
<br>
Paul<br>
</blockquote></div>