Skip to content

Commit f221f57

Browse files
committed
pattern matching -> casamento de padrões
(termo da documentação PT-BR do Python)
1 parent c68d381 commit f221f57

File tree

13 files changed

+75
-75
lines changed

13 files changed

+75
-75
lines changed

online/cap02.adoc

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,7 @@ Então o primeiro alvo seria `(record,)` e o segundo `((field,),)`.
865865
Nos dois casos, esquecer aquela vírgula causa um bug
866866
silencioso.footnote:[Agradeço ao revisor técnico Leonardo Rochael por esse exemplo.]
867867

868-
Agora vamos estudar _pattern matching_,
868+
Agora vamos estudar casamento de padrões,
869869
que suporta maneiras ainda mais poderosas para desempacotar
870870
sequências.((("", startref="Sunpack02")))((("", startref="iterun02")))
871871

@@ -874,21 +874,21 @@ sequências.((("", startref="Sunpack02")))((("", startref="iterun02")))
874874
=== Pattern matching com sequências
875875

876876
O((("match/case statement")))((("sequences", "pattern matching with", id="Spattern02")))((("pattern matching", "match/case statement")))
877-
novo recurso mais visível de Python 3.10 é o _pattern matching_
878-
(casamento de padrões) com a instrução `match/case`, proposta na
877+
novo recurso mais visível de Python 3.10 é o
878+
casamento de padrões (_pattern matching_) com a instrução `match/case`, proposta na
879879
https://fpy.li/pep634[PEP 634—Structural Pattern Matching: Specification (_Casamento Estrutural de Padrões: Especificação_)] (EN).
880880

881881
[role="man-height2"]
882882
[NOTE]
883883
====
884884
Carol Willing, uma das desenvolvedoras principais de Python,
885-
escreveu uma excelente introdução ao _pattern matching_ na seção
886-
https://fpy.li/2r["Casamento de padrão estrutural"]footnote:[NT: A tradução em português da documentação de
887-
Python adotou o termo "casamento de padrões" no lugar de _pattern matching_.
885+
escreveu uma excelente introdução ao casamento de padrões na seção
886+
https://fpy.li/2r["Casamento de padrão estrutural"]footnote:[NT:
887+
Os tradutores da documentação de Python em português do Brasil
888+
adotaram o termo "casamento de padrões" no lugar de _pattern matching_.
888889
O termo em inglês é usado nas comunidades brasileiras
889-
de linguagens que implementam _pattern matching_ há muitos anos, como por exemplo Scala,
890-
Elixir e Haskell.
891-
Naturalmente mantivemos os títulos originais nos links externos.]
890+
de linguagens que implementam casamento de padrões há muitos anos,
891+
como por exemplo Scala, Elixir e Haskell.]
892892
em https://fpy.li/2s["O que há de novo no Python 3.10"].
893893
Você pode querer ler aquela revisão rápida.
894894
Neste livro, dividi o tratamento do casamento de padrões em diferentes capítulos,
@@ -947,7 +947,7 @@ Uma melhoria fundamental do `match` sobre o `switch` é((("destructuring")))
947947
a _desestruturação_—uma forma mais avançada de desempacotamento.
948948
Desestruturação é uma palavra nova no vocabulário de Python,
949949
mas é usada com frequência na documentação de linguagens
950-
que suportam o _pattern matching_—como Scala e Elixir.
950+
que suportam o casamento de padrões—como Scala e Elixir.
951951

952952
Como um primeiro exemplo de desestruturação, o <<ex_nested_tuple_match>>
953953
mostra parte do <<ex_nested_tuple>> reescrito com `match/case`.
@@ -1102,7 +1102,7 @@ https://fpy.li/2-10["A very deep iterable and type match with extraction" (_Um m
11021102

11031103
O <<ex_nested_tuple_match>> não é melhor que o <<ex_nested_tuple>>.
11041104
É apenas um exemplo para contrastar duas formas de fazer a mesma coisa.
1105-
O próximo exemplo mostra como o _pattern matching_ contribui para a criação de código claro, conciso e eficaz.
1105+
O próximo exemplo mostra como o casamento de padrões contribui para a criação de código claro, conciso e eficaz.
11061106

11071107
[[pattern_matching_seq_interp_sec]]
11081108
==== Casando padrões de sequência em um interpretador
@@ -1115,7 +1115,7 @@ https://fpy.li/2-11[_lis.py_]:
11151115
um interpretador de um subconjunto do dialeto Scheme da linguagem de programação Lisp,
11161116
em 132 belas linhas de código Python legível.
11171117
Peguei o código-fonte de Norvig (publicado sob a licença MIT) e o atualizei para Python 3.10,
1118-
para exemplificar o _pattern matching_.
1118+
para exemplificar o casamento de padrões.
11191119
Nessa seção, vamos comparar uma parte fundamental do código de Norvig—que usa `if/elif` e
11201120
desempacotamento—com uma nova versão usando `match/case`.
11211121

@@ -1166,7 +1166,7 @@ include::../code/02-array-seq/lispy/py3.9/lis.py[tags=EVAL_IF_MIDDLE]
11661166
====
11671167

11681168
Observe como cada instrução `elif` verifica o primeiro item da lista, e então desempacota a lista, ignorando o primeiro item.
1169-
O uso extensivo do desempacotamento sugere que Norvig é um fã do _pattern matching_,
1169+
O uso extensivo do desempacotamento sugere que Norvig é um fã do casamento de padrões,
11701170
mas ele originalmente escreveu aquele código em Python 2 (apesar de agora ele funcionar com qualquer Python 3)
11711171

11721172
Usando `match/case` em Python ≥ 3.10, podemos refatorar `evaluate`, como mostrado no <<ex_match_eval>>.
@@ -1194,7 +1194,7 @@ Sem o último `case`, para pegar tudo que tiver passado pelos anteriores,
11941194
o bloco `match` não faz nada quando o sujeito não casa com algum `case`—e isso pode causar uma falha silenciosa.
11951195

11961196
Norvig deliberadamente evitou a checagem e o tratamento de erros em _lis.py_, para manter o código fácil de entender.
1197-
Com _pattern matching_, podemos acrescentar mais verificações e ainda manter o programa legível.
1197+
Com casamento de padrões, podemos acrescentar mais verificações e ainda manter o programa legível.
11981198
Por exemplo, no padrão `'define'`,
11991199
o código original não se assegura que `name` é uma instância de `Symbol`—isso exigiria um bloco `if`,
12001200
uma chamada a `isinstance`, e mais código.
@@ -1275,10 +1275,10 @@ o segundo elemento deve ser um `Symbol` na forma original de `define`,
12751275
mas deve ser uma sequência começando com um `Symbol` na sintaxe de `define` para definição de função.
12761276

12771277
Agora pense em quanto trabalho teríamos para adicionar o suporte a essa segunda sintaxe de `define`
1278-
sem a ajuda do _pattern matching_ no <<ex_norvigs_eval>>.
1278+
sem a ajuda do casamento de padrões no <<ex_norvigs_eval>>.
12791279
A instrução `match` faz mais que o `switch` das linguagens similares ao C.
12801280

1281-
O _pattern matching_ é um exemplo de programação declarativa:
1281+
O casamento de padrões é um exemplo de programação declarativa:
12821282
o código descreve "o que" você quer casar,
12831283
em vez de "como" casar.
12841284
A forma do código segue a forma dos dados, como ilustra a <<syntax_and_pattern_tbl>>.
@@ -1295,7 +1295,7 @@ A forma do código segue a forma dos dados, como ilustra a <<syntax_and_pattern_
12951295
| `(define (name parms…) body1 body2…)` | `['define', [Symbol() as name, *parms], *body] if body`
12961296
|============================================================================
12971297

1298-
Espero que a refatoração do `evaluate` de Norvig com _pattern matching_
1298+
Espero que a refatoração do `evaluate` de Norvig com casamento de padrões
12991299
tenha convencido você que `match/case` pode tornar seu código mais legível e mais seguro.
13001300

13011301
[NOTE]
@@ -1306,7 +1306,7 @@ Se você quiser aprender mais sobre o _lys.py_ de Norvig, leia seu maravilhoso p
13061306
https://fpy.li/2-12["(How to Write a (Lisp) Interpreter (in Python))" _(Como Escrever um Interpretador (Lisp) em (Python))_].
13071307
====
13081308

1309-
Isso conclui nossa primeira passagem por desempacotamento, desestruturação e _pattern matching_ com sequências.
1309+
Isso conclui nossa primeira passagem por desempacotamento, desestruturação e casamento de padrões com sequências.
13101310
Vamos tratar de outros tipos de padrões mais adiante, em outros capítulos.
13111311

13121312
Todo programador Python sabe que sequências podem ser fatiadas usando a sintaxe `s[a:b]`.

online/cap03.adoc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ evitando o excesso de laços e condicionais aninhados.
3030
Aqui está um breve esquema do capítulo:
3131

3232
* A sintaxe moderna((("dictionaries and sets", "topics covered"))) para criar e manipular `dicts`
33-
e mapeamentos, incluindo desempacotamento aumentado e _pattern matching_ (casamento de padrões)
33+
e mapeamentos, incluindo desempacotamento aumentado e casamento de padrões (_pattern matching_)
3434
* Métodos comuns dos tipos de mapeamentos
3535
* Tratamento especial para chaves ausentes
3636
* Variantes de `dict` na biblioteca padrão
@@ -202,7 +202,7 @@ https://fpy.li/pep584[PEP 584—Add Union Operators To dict (_Acrescentar Operad
202202
(EN) inclui um bom resumo das outras formas de mesclar mapeamentos.
203203
====
204204

205-
Agora vamos ver como o pattern matching se aplica aos mapeamentos.((("", startref="DASsyntax03")))
205+
Agora vamos ver como o casamento de padrões se aplica aos mapeamentos.((("", startref="DASsyntax03")))
206206

207207
[[pattern_matching_mappings_sec]]
208208
=== Pattern matching com mapeamentos
@@ -222,7 +222,7 @@ Veja https://fpy.li/2z[`Py_TPFLAGS_MAPPING`] (EN).]
222222

223223
No <<ch_sequences>> nos concentramos apenas nos padrões de sequência,
224224
mas tipos diferentes de padrões podem ser combinados e aninhados.
225-
Graças à desestruturação, o pattern matching é uma ferramenta poderosa para
225+
Graças à desestruturação, o casamento de padrões é uma ferramenta poderosa para
226226
processar registros estruturados como sequências e mapeamentos aninhados,
227227
que frequentemente precisamos ler de APIs JSON ou bancos de dados
228228
que suportam registros ou campos semi-estruturados,
@@ -292,13 +292,13 @@ Ice cream details: {'flavor': 'vanilla', 'cost': 199}
292292
Na <<mappings_flexible_sec>>, vamos estudar o `defaultdict` e
293293
outros mapeamentos onde buscas com chaves via `+__getitem__+`
294294
(isto é, `d[chave]`) funcionam porque itens ausentes são criados na hora.
295-
No contexto do pattern matching,
295+
No contexto do casamento de padrões,
296296
um match é bem sucedido apenas se o sujeito já tem as chaves necessárias no início do bloco `match`.
297297

298298
[TIP]
299299
====
300300
O tratamento automático de chaves ausentes não é acionado porque
301-
o pattern matching sempre usa o método `d.get(key, sentinel)`—onde o
301+
o casamento de padrões sempre usa o método `d.get(key, sentinel)`—onde o
302302
`sentinel` default é um marcador com valor especial, que não pode aparecer nos dados do usuário.
303303
====
304304

@@ -1562,7 +1562,7 @@ Com isso, encerramos esse capítulo.
15621562

15631563
Dicionários((("dictionaries and sets", "overview of"))) são a pedra fundamental de Python.
15641564
Ao longo dos anos, a sintaxe literal familiar `{k1: v1, k2: v2}`
1565-
foi aperfeiçoada para suportar desempacotamento com `**` e pattern matching, bem como com compreensões de `dict`.
1565+
foi aperfeiçoada para suportar desempacotamento com `**` e casamento de padrões, bem como com compreensões de `dict`.
15661566

15671567
Além do `dict` básico, a biblioteca padrão oferece mapeamentos práticos prontos para serem usados,
15681568
como o `defaultdict`, o `ChainMap`, e o `Counter`, todos definidos no módulo `collections`.

online/cap05.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,8 +1453,8 @@ id="DCBpattern05")))((("pattern matching", "pattern matching class instances", i
14531453
são projetados para "casar" com instâncias de classes por tipo e—opcionalmente—por atributos.
14541454
O sujeito de um padrão de classe pode ser uma instância de qualquer classe,
14551455
não apenas instâncias de classes de dados.footnote:[Trato desse conteúdo aqui por ser o
1456-
primeiro capítulo sobre classes definidas pelo usuário, e acho que _pattern matching_ com classes
1457-
é um assunto muito importante para esperar até a <<function_objects_part>> do livro.
1456+
primeiro capítulo sobre classes definidas pelo usuário, e considero o casamento de padrões com classes
1457+
um assunto importante demais para esperar até a <<function_objects_part>> do livro.
14581458
Minha filosofia: é mais importante saber como usar classes que como defini-las.]
14591459

14601460
Há três variantes de padrões de classes: simples, nomeado e posicional.
@@ -1701,7 +1701,7 @@ frustrando um princípio básico da programação orientada a objetos:
17011701
os dados e as funções que acessam os dados devem estar juntos na mesma classe.
17021702
Classes sem uma lógica podem ser um sinal de uma lógica fora de lugar.
17031703

1704-
Na última seção, vimos como o _pattern matching_
1704+
Na última seção, vimos como o casamento de padrões
17051705
funciona com instâncias de qualquer classe como sujeitos—e
17061706
não apenas das classes criadas com as fábricas apresentadas nesse capítulo.
17071707

online/cap07.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ Após esse mergulho nos recursos flexíveis de declaração de argumentos no Pyt
520520

521521
=== Pacotes para programação funcional
522522

523-
Apesar((("functions, as first-class objects", "packages for functional programming", id="FAFfp07")))((("functional programming", "packages for", id="fprogpack07"))) de Guido deixar claro que não projetou Python para ser uma linguagem de programação funcional, o estilo de programação funcional pode ser amplamente utilizado, graças a funções de primeira classe, _pattern matching_ e o suporte de pacotes como `operator` e `functools`, dos quais falaremos nas próximas duas seções.
523+
Apesar((("functions, as first-class objects", "packages for functional programming", id="FAFfp07")))((("functional programming", "packages for", id="fprogpack07"))) de Guido deixar claro que não projetou Python para ser uma linguagem de programação funcional, o estilo de programação funcional pode ser amplamente utilizado, graças a funções de primeira classe, casamento de padrões e o suporte de pacotes como `operator` e `functools`, dos quais falaremos nas próximas duas seções.
524524

525525

526526
[[operator_module_sec]]

online/cap11.adoc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -686,10 +686,10 @@ construtor embutido `complex()`. Talvez `Vector2d` pudesse oferecer o
686686
startref="POhash11")))
687687

688688
[[positional_pattern_implement_sec]]
689-
=== Suportando o pattern matching posicional
689+
=== Suportando o casamento de padrões posicionais
690690

691691
Até aqui, instâncias de `Vector2d`((("Pythonic objects", "supporting positional
692-
patterns")))((("positional patterns"))) são compatíveis com o _pattern matching_
692+
patterns")))((("positional patterns"))) são compatíveis com o casamento de padrões
693693
com instâncias de classe—vistos na <<keyword_class_patterns_sec>>.
694694

695695
No <<vector_match_keyword_ex>>, todos aqueles padrões nomeados funcionam como esperado.
@@ -720,7 +720,7 @@ TypeError: Vector2d() accepts 0 positional sub-patterns (1 given)
720720

721721
Para fazer `Vector2d` funcionar com padrões posicionais, precisamos acrescentar
722722
um atributo de classe chamado `+__match_args__+`, listando os atributos de
723-
instância na ordem em que eles serão usados no pattern matching posicional.
723+
instância na ordem em que eles serão usados no casamento de padrões posicionais.
724724

725725

726726
[source, python]
@@ -1033,7 +1033,7 @@ include::../code/11-pythonic-obj/vector2d_v3_slots.py[tags=VECTOR2D_V3_SLOTS]
10331033
# methods are the same as previous version
10341034
----
10351035
====
1036-
<1> `+__match_args__+` lista os nomes dos atributos públicos, para _pattern matching_ posicional.
1036+
<1> `+__match_args__+` lista os nomes dos atributos públicos, para casamento de padrões posicionais.
10371037
<2> `+__slots__+`, por outro lado, lista os nomes dos atributos de instância, que neste caso são atributos privados.
10381038

10391039
Para medir a economia de memória, escrevi o script _mem_test.py_. Ele recebe,

online/cap12.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,9 +519,9 @@ include::../code/12-seq-hacking/vector_v3.py[tags=VECTOR_V3_GETATTR]
519519
----
520520
====
521521

522-
<1> Define `+__match_args__+` para permitir _pattern matching_ posicional sobre
522+
<1> Define `+__match_args__+` para permitir casamento de padrões posicionais sobre
523523
os atributos dinâmicos suportados por `+__getattr__+`.footnote:[Apesar de
524-
`+__match_args__+` existir para suportar _pattern matching_ desde o Python 3.10,
524+
`+__match_args__+` existir para suportar casamento de padrões desde o Python 3.10,
525525
é inofensivo definir este atributo em versões anteriores da linguagem. Na
526526
primeira edição chamei este atributo de `shortcut_names`. Com o novo nome, ele
527527
cumpre dois papéis: suportar padrões posicionais em instruções `case` e guardar

online/cap18.adoc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ mecanismos de controle de fluxo não muito comuns em outras linguagens e que, po
2424
essa razão, podem ser ignorados ou subutilizados em Python. São eles:
2525

2626
* A instrução `with` e o protocolo de gerenciamento de contexto
27-
* A instrução `match/case` para _pattern matching_ (casamento de padrões)
27+
* A instrução `match/case` para casamento de padrões (_pattern matching_)
2828
* A cláusula `else` nas instruções `for`, `while`, e `try`
2929

3030
A instrução `with` cria um contexto temporário e o destrói com segurança, sob o
@@ -33,7 +33,7 @@ repetitivo, tornando as APIs ao mesmo tempo mais seguras e mais fáceis de usar.
3333
Programadores Python estão encontrando muitos usos para blocos `with` além do
3434
fechamento automático de arquivos.
3535

36-
Já estudamos _pattern matching_ em capítulos anteriores, mas aqui veremos como a
36+
Já estudamos casamento de padrões em capítulos anteriores, mas aqui veremos como a
3737
gramática de uma linguagem de programação pode ser expressa como padrões de
3838
sequências.
3939
Por isso `match/case` é uma ferramenta eficiente para criar processadores de
@@ -562,7 +562,7 @@ do _lis.py_, e também explorar todas as cláusulas `case` de `evaluate`,
562562
explicando não apenas os padrões mas também o que o interpretador faz em cada
563563
`case`.
564564

565-
Além de mostrar mais _pattern matching_, escrevi essa seção por três razões:
565+
Além de mostrar mais casamento de padrões, escrevi essa seção por três razões:
566566

567567
. O _lis.py_ de Norvig é um lindo exemplo de código Python idiomático.
568568
. A simplicidade do Scheme é uma aula magna de design de linguagens.
@@ -1338,7 +1338,7 @@ Meus objetivos aqui eram compartilhar com vocês a beleza do pequeno interpretad
13381338
explicar melhor como as clausuras funcionam,
13391339
e mostrar como `match/case` foi uma ótima adição ao Python.
13401340

1341-
Para fechar essa seção estendida sobre _pattern matching_,
1341+
Para fechar essa seção estendida sobre casamento de padrões,
13421342
vamos formalizar o conceito de um OR-pattern (_padrão-OU_).((("", startref="lispyproced18")))
13431343

13441344
==== Using padrões-OU
@@ -1562,7 +1562,7 @@ função central de qualquer interpretador. Entender o funcionamenteo de
15621562
`evaluate` exigiu revisar um pouco de Scheme, um parser para expressões-S, um
15631563
REPL simples e a construção de escopos aninhados através de `Environment`, uma
15641564
subclasse de `collection.ChainMap`. No fim, _lys.py_ se tornou um instrumento
1565-
para explorarmos mais que _pattern matching_. Ele mostra como diferentes partes
1565+
para explorarmos mais que casamento de padrões. Ele mostra como diferentes partes
15661566
de um interpretador trabalham juntas, jogando luz sobre recursos fundamentais do
15671567
próprio Python: porque palavras reservadas são necessárias, como as regras de
15681568
escopo funcionam, e como clausuras são criadas e usadas.
@@ -1820,11 +1820,11 @@ Python, que implementa PTC. Aprendi a fazer isso lendo o código de Peter Norvig
18201820
Obrigado por compartilhar, professor!((("", startref="tco18")))((("",
18211821
startref="PTC18")))((("", startref="SStail18")))
18221822
1823-
*A opinião de Norvig sobre `evaluate()` com _pattern matching_*
1823+
*A opinião de Norvig sobre `evaluate()` com casamento de padrões*
18241824
18251825
Eu((("Soapbox sidebars", "lis.py and evaluate function")))
18261826
compartilhei o código da versão Python 3.10 de _lis.py_ com Peter Norvig.
1827-
Ele gostou do exemplo usando _pattern matching_, mas sugeriu uma solução diferente:
1827+
Ele gostou do exemplo usando casamento de padrões, mas sugeriu uma solução diferente:
18281828
em vez de usar os guardas que escrevi,
18291829
ele teria exatamente um `case` por palavra reservada,
18301830
e teria testes dentro de cada `case`, para fornecer mensagens de `SyntaxError`
@@ -1838,7 +1838,7 @@ https://fpy.li/18-54[_mylis_].
18381838
Mas a forma como estruturei `evaluate` no <<ex_evaluate_match>>
18391839
tem algumas vantagens didáticas nesse livro:
18401840
o exemplo é paralelo à implementação com `if/elif/…` (<<ex_norvigs_eval>>),
1841-
as cláusulas `case` demonstram mais recursos de _pattern matching_
1841+
as cláusulas `case` demonstram mais recursos de casamento de padrões
18421842
e o código é mais conciso.((("", startref="WMEBsoap18")))
18431843
18441844
****

0 commit comments

Comments
 (0)