Hey Steven,

I'm also at PyCon. Shall we take this off list and attempt to meet up and 
discuss?

On Friday, May 11, 2018 at 12:36:32 PM UTC-4, ste...@rigetti.com wrote:
>
> Hi everyone, I’m also a first time poster to python-ideas so I apologize 
> if reviving a week old thread is bad form. I emailed Guido out of the blue 
> to share some thoughts on the JavaScript pattern matching proposal’s 
> applicability to Python and he encouraged me to post those thoughts here.
>
> The best argument for pattern matching is to support what Daniel F Mossat 
> above calls “structural patterns”. These go beyond simple value matching or 
> boolean conditions that are better served with other constructs like if 
> statements. Structural pattern matching allows for reasoning about the 
> shape of data.
>
> As a practical example, in my day job I work as a software engineer at a 
> startup that builds quantum computers. Python has been a great language for 
> writing physics experiments and doing numerical simulations. However, our 
> codebase contains a lot of `isinstance` calls due to the need to write 
> converters from the physics experiment definition language to quantum 
> assembly instructions. There’s some examples in our open source code as 
> well, for instance here: 
> https://github.com/rigetticomputing/pyquil/blob/master/pyquil/quil.py#L641 
> . This could be written more succinctly as:
>
> match instr:
>     case Gate(name, params, qubits): result.append(Gate(name, params, [
> qubit_mapping[q] for q in qubits])
>     case Measurement(qubit, classical_reg): result.append(Measurement(
> qubit_mapping[qubit], classical_reg)
>     else: result.append(instr)
>
> Something that I also haven’t seen discussed yet is how well this would 
> work with the new Python 3.7 dataclasses. Dataclasses allow us to create 
> more structured data than using dicts alone. For instance, each instruction 
> in our internal assembly language has its own dataclass. Pattern matching 
> would make it easy to create readable code which loops over a list of these 
> instructions and performs some sort of optimizations/transformations.
>
> Finally I want to talk about matching on the structure of built-in data 
> structures like lists and dicts. The javascript proposal does a great job 
> of supporting these data types and I think this would also be natural for 
> Python which also has some destructuring bind support for these types on 
> assignment.
>
> Consider the example of accessing nested dictionaries. This comes up a lot 
> when working with JSON. If you had a dictionary like this:
>
> target = {'galaxy': {'system': {'planet': 'jupiter'}}}
>
> Then trying to access the value ‘jupiter’ would mean one of these 
> alternatives:
>
> # Risks getting a ValueError
> my_planet = target[‘galaxy’][‘system’][‘planet’]
> print(my_planet)
>
> # Awkward to read
> my_planet = target.get(‘galaxy’, {}).get(‘system’, {}).get(‘planet’)
> if my_planet:
>   print(my_planet)
>
> With pattern matching this could become more simply:
>
> match target:
>   case {‘galaxy’: {‘system’: {‘planet’: my_planet}}}: print(my_planet)
>
> This example was stolen from the tutorial for the glom library 
> https://sedimental.org/glom_restructured_data.html which works on nested 
> data. Structural pattern matching is a more universal concept and could 
> eliminate the need for these kinds of helper functions.
>
> From reading through this thread (as well as other background reading like 
> https://groups.google.com/forum/#!msg/python-ideas/aninkpPpEAw/wCQ1IH5mAQAJ 
> and the Javascript proposal) a couple things seem clear to me for pattern 
> matching in the case of Python:
> - it should be statement based
> - it should have great support for built-in data types like lists, dicts, 
> namedtuples, and dataclasses
> - it should form a coherent story with other similar Python concepts like 
> unpacking on assignment
>
> There are a ton of details to be worked out obviously and we should go 
> slow as Guido suggested. However, I believe that it would be worth doing 
> the work. To that end: if there’s anyone else who’d like to collaborate and 
> come up with a first draft of a more well-defined proposal I would love to 
> commit my time to this, my email is below.
>
> Also, I sent this email from PyCon in Cleveland if anyone would like to 
> brainstorm in person :).
>
> Steven Heidel
> Rigetti Quantum Computing
> ste...@rigetti.com <javascript:>
>
> On Friday, May 4, 2018 at 4:37:43 PM UTC, Guido van Rossum wrote:
>>
>> Can I recommend going slow here? This is a very interesting topic where 
>> many languages have gone before. I liked Daniel F Moisset's analysis about 
>> the choices of a language designer and his conclusion that match should be 
>> a statement.
>>
>> I just noticed the very similar proposal for JavaScript linked to by the 
>> OP: https://github.com/tc39/proposal-pattern-matching -- this is more 
>> relevant than what's done in e.g. F# or Swift because Python and JS are 
>> much closer. (Possibly Elixir is also relevant, it seems the JS proposal 
>> borrows from that.)
>>
>> A larger topic may be how to reach decisions. If I've learned one thing 
>> from PEP 572 it's that we need to adjust how we discuss and evaluate 
>> proposals. I'll think about this and start a discussion at the Language 
>> Summit about this.
>>
>> -- 
>> --Guido van Rossum (python.org/~guido)
>>
>
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to