Skip to content

Commit ee5fbdf

Browse files
committed
destinatário->receptor, a framework -> o framework
em conformidade com guia-de-estilo.adoc
1 parent 3d2807b commit ee5fbdf

File tree

16 files changed

+62
-43
lines changed

16 files changed

+62
-43
lines changed

capitulos/cap01.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ Entretanto, se você aprendeu outra linguagem orientada a objetos antes do Pytho
2929
Essa aparente esquisitice é a ponta de um iceberg que, quando compreendido de forma apropriada, é a chave para tudo aquilo que chamamos de _pythônico_.
3030
O iceberg se chama o Modelo de Dados do Python, e é a API que usamos para fazer nossos objetos lidarem bem com os aspectos mais idiomáticos da linguagem.
3131

32-
É((("Python Data Model", "overview of"))) possível pensar no modelo de dados como uma descrição do Python na forma de uma framework. Ele formaliza as interfaces dos elementos constituintes da própria linguagem, como sequências, funções, iteradores, corrotinas, classes, gerenciadores de contexto e assim por diante.
32+
É((("Python Data Model", "overview of"))) possível pensar no modelo de dados como uma descrição do Python na forma de um framework. Ele formaliza as interfaces dos elementos constituintes da própria linguagem, como sequências, funções, iteradores, corrotinas, classes, gerenciadores de contexto e assim por diante.
3333

34-
Quando usamos uma framework, gastamos um bom tempo programando métodos que são chamados por ela. O mesmo acontece quando nos valemos do Modelo de Dados do Python para criar novas classes. O interpretador do Python invoca((("special methods", "purpose of"))) métodos especiais para realizar operações básicas sobre os objetos, muitas vezes acionados por uma sintaxe especial.
34+
Quando usamos um framework, gastamos um bom tempo programando métodos que são chamados por ela. O mesmo acontece quando nos valemos do Modelo de Dados do Python para criar novas classes. O interpretador do Python invoca((("special methods", "purpose of"))) métodos especiais para realizar operações básicas sobre os objetos, muitas vezes acionados por uma sintaxe especial.
3535
Os((("special methods", "naming conventions")))((("__ (double underscore)")))((("double underscore (__)"))) nomes dos métodos especiais são sempre precedidos e seguidos de dois sublinhados.
3636
Por exemplo, a sintaxe `obj[key]` está amparada no método especial `+__getitem__+`.
3737
Para resolver `my_collection[key]`, o interpretador chama `+my_collection.__getitem__(key)+`.
@@ -674,6 +674,6 @@ A parte _metaobjetos_ se refere aos objetos que são os componentes essenciais d
674674
Um protocolo de metaobjetos rico permite estender a linguagem para suportar novos paradigmas de programação. Gregor Kiczales, o primeiro autor do _AMOP_, mais tarde se tornou um pioneiro da programação orientada a aspecto, e o autor inicial do AspectJ, uma extensão de Java implementando aquele paradigma.
675675
A programação orientada a aspecto é muito mais fácil de implementar em uma linguagem dinâmica como Python, e algumas frameworks fazem exatamente isso.
676676
O exemplo mais importante é a https://fpy.li/1-12[_zope.interface_] (EN),
677-
parte da framework sobre a qual o sistema de gerenciamento de conteúdo https://plone.org.br/[Plone] é construído.
677+
parte do framework sobre a qual o sistema de gerenciamento de conteúdo https://plone.org.br/[Plone] é construído.
678678
****
679679

capitulos/cap05.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ Dada uma instância de tupla nomeada `x`, a chamada `+x._replace(**kwargs)+` dev
258258

259259
===== Nova classe durante a execução
260260

261-
Apesar da sintaxe de declaração de classe ser mais legível, ela é fixa no código. Uma framework pode ter a necessidade de criar classes de dados durante a execução. Para tanto, podemos usar a sintaxe default de chamada de função de `collections.namedtuple`, que também é suportada por `typing.NamedTuple`. O módulo `dataclasses` oferece a função `make_dataclass`, com o mesmo propósito.
261+
Apesar da sintaxe de declaração de classe ser mais legível, ela é fixa no código. Um framework pode ter a necessidade de criar classes de dados durante a execução. Para tanto, podemos usar a sintaxe default de chamada de função de `collections.namedtuple`, que também é suportada por `typing.NamedTuple`. O módulo `dataclasses` oferece a função `make_dataclass`, com o mesmo propósito.
262262

263263
Após essa visão geral dos principais recursos das fábricas de classes de dados, vamos examinar cada uma delas mais de perto, começando pela mais simples.((("", startref="DCBmain05")))
264264

capitulos/cap07.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ Quando chamados, devolvem um gerador assíncrono para ser usado com `async for`.
311311

312312
Funções geradoras, funções de corrotinas nativas e geradoras assíncronas são diferentes de outros invocáveis: os valores devolvidos tais funções nunca são dados da aplicação, mas objetos que exigem processamento adicional, seja para produzir dados da aplicação, seja para realizar algum trabalho útil.
313313
Funções geradoras devolvem iteradores. Ambos são tratados no <<iterables2generators>>.
314-
Funções de corrotinas nativas e funções geradoras assíncronas devolvem objetos que só funcionam com a ajuda de uma framework de programação assíncrona, tal como _asyncio_.
314+
Funções de corrotinas nativas e funções geradoras assíncronas devolvem objetos que só funcionam com a ajuda de um framework de programação assíncrona, tal como _asyncio_.
315315
Elas são o assunto do <<async_ch>>.
316316

317317

capitulos/cap08.adoc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1972,7 +1972,8 @@ ____
19721972
Acho que bibliotecas com APIs 'pythônicas' são as menos propensas a adotar esse sistema de tipagem, pois ele vai adicionar muito pouco valor a elas.
19731973
____
19741974
1975-
Naquela mensagem, Benfield incluiu esse exemplo extremo de uma tentativa de definição de tipo para o argumento de palavra-chave `files` em https://fpy.li/8-53[`requests.request()`]:
1975+
Naquela mensagem, Benfield incluiu esse exemplo extremo de uma tentativa de definição de tipo para o
1976+
argumento nomeado `files` em https://fpy.li/8-53[`requests.request()`]:
19761977
19771978
----
19781979
Optional[

capitulos/cap09.adoc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,15 @@ A https://fpy.li/9-12[PEP 3104--Access to Names in Outer Scopes (_Acesso a Nomes
12581258

12591259
Em um nível mais teórico, a https://fpy.li/9-13[PEP 227--Statically Nested Scopes (_Escopos Estaticamente Aninhados_)] (EN) documenta a introdução do escopo léxico como um opção no Python 2.1 e como padrão no Python 2.2, explicando a justificativa e as opções de design para a implementação de clausuras no Python.
12601260

1261-
A https://fpy.li/9-14[PEP 443] (EN) traz a justificativa e uma descrição detalhada do mecanismo de funções genéricas de despacho único. Um antigo (março de 2005) post de blog de Guido van Rossum, https://fpy.li/9-15["Five-Minute Multimethods in Python" (_Multi-métodos em Python em Cinco Minutos_)] (EN), mostra os passos para uma implementação de funcões genéricas (também chamadas multi-métodos) usando decoradores. O código de multi-métodos de Guido é interessante, mas é um exemplo didático. Para ver uma implementação moderna e pronta para ser usada em produção de funções genéricas de despacho múltiplo, veja a https://fpy.li/9-16[Reg] de Martijn Faassen–autor da https://fpy.li/9-17[Morepath], uma framework web guiada por modelos e compatível com REST.
1261+
A https://fpy.li/9-14[PEP 443] (EN) traz a justificativa e uma descrição detalhada do mecanismo de funções genéricas de despacho único.
1262+
Um post de Guido van Rossum de março de 2005
1263+
https://fpy.li/9-15["Five-Minute Multimethods in Python" (_Multi-métodos em Python em Cinco Minutos_)] (EN),
1264+
mostra os passos para uma implementação de funcões genéricas (também chamadas multi-métodos) usando decoradores.
1265+
O código de multi-métodos de Guido é interessante, mas é apenas um exemplo didático.
1266+
Para conhecer uma implementação de funções genéricas de despacho múltiplo moderna e pronta para uso em produção,
1267+
veja a https://fpy.li/9-16[Reg] de
1268+
Martijn Faassen–autor de https://fpy.li/9-17[Morepath],
1269+
um framework web guiado por modelos e orientado a REST.
12621270

12631271
[[closures_soapbox]]
12641272
[role="pagebreak-before less_space"]

capitulos/cap10.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,12 +307,12 @@ Na próxima seção vamos discutir Comando (_Command_)—outro padrão de projet
307307
Comando((("functions, design patterns with first-class", "Command pattern", id="FDPcommand10")))((("Command pattern", id="cmmd10")))((("refactoring strategies", "Command pattern", id="RScmmnd10")))((("UML class diagrams", "Command design pattern"))) é outro padrão de projeto que pode ser simplificado com o uso de funções passadas como argumentos. A <<command_uml>> mostra o arranjo das classes nesse padrão.
308308

309309
[[command_uml]]
310-
.Diagrama de classes UML para um editor de texto controlado por menus, implementado com o padrão de projeto Comando. Cada comando pode ter um destinatário (_receiver_) diferente: o objeto que implementa a ação. Para `PasteCommand`, o destinatário é Document. Para `OpenCommand`, o destinatário á a aplicação.
310+
.Diagrama de classes UML para um editor de texto controlado por menus, implementado com o padrão de projeto Comando. Cada comando pode ter um receptor (_receiver_) diferente: o objeto que implementa a ação. Para `PasteCommand`, o receptor é Document. Para `OpenCommand`, o receptor á a aplicação.
311311
image::images/flpy_1002.png[Aplicação do padrão Comando a um editor de texto]
312312

313-
O objetivo de Comando é desacoplar um objeto que invoca uma operação (o _invoker_ ou remetente) do objeto fornecedor que implementa aquela operação (o _receiver_ ou destinatário). No exemplo em _Padrões de Projetos_, cada remetente é um item de menu em uma aplicação gráfica, e os destinatários são o documento sendo editado ou a própria aplicação.
313+
O objetivo de Comando é desacoplar um objeto que invoca uma operação (o _invoker_ ou remetente) do objeto fornecedor que implementa aquela operação (o _receiver_ ou receptor). No exemplo em _Padrões de Projetos_, cada remetente é um item de menu em uma aplicação gráfica, e os receptors são o documento sendo editado ou a própria aplicação.
314314

315-
A ideia é colocar um objeto `Command` entre os dois, implementando uma interface com um único método, `execute`, que chama algum método no destinatário para executar a operação desejada. Assim, o remetente não precisa conhecer a interface do destinatário, e destinatários diferentes podem ser adaptados com diferentes subclasses de `Command`. O remetente é configurado com um comando concreto, e o opera chamando seu método `execute`. Observe na <<command_uml>> que `MacroCommand` pode armazenar um sequência de comandos; seu método `execute()` chama o mesmo método em cada comando armazenado.
315+
A ideia é colocar um objeto `Command` entre os dois, implementando uma interface com um único método, `execute`, que chama algum método no receptor para executar a operação desejada. Assim, o remetente não precisa conhecer a interface do receptor, e receptors diferentes podem ser adaptados com diferentes subclasses de `Command`. O remetente é configurado com um comando concreto, e o opera chamando seu método `execute`. Observe na <<command_uml>> que `MacroCommand` pode armazenar um sequência de comandos; seu método `execute()` chama o mesmo método em cada comando armazenado.
316316

317317
Citando _Padrões de Projetos_, "Comandos são um substituto orientado a objetos para _callbacks_." A pergunta é: precisamos de um substituto orientado a objetos para _callbacks_? Algumas vezes sim, mas nem sempre.
318318

capitulos/cap11.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Graças((("Pythonic objects", "building user-defined classes"))) ao Modelo de Da
2121

2222
Nos capítulos anteriores, estudamos o comportamento de vários objetos embutidos. Vamos agora criar classes definidas pelo usuário que se portam como objetos Python reais.
2323
As classes na sua aplicação provavelmente não precisam nem devem implementar tantos métodos especiais quanto os exemplos nesse capítulo.
24-
Mas se você estiver escrevendo uma biblioteca ou uma framework, os programadores que usarão suas classes talvez esperem que elas se comportem como as classes fornecidas pelo Python.
24+
Mas se você estiver escrevendo uma biblioteca ou um framework, os programadores que usarão suas classes talvez esperem que elas se comportem como as classes fornecidas pelo Python.
2525
Satisfazer tal expectativa é um dos jeitos de ser "pythônico".
2626

2727
Esse capítulo começa onde o <<data_model>> terminou, mostrando como implementar vários métodos especiais comumente vistos em objetos Python de diferentes tipos.

capitulos/cap13.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ True
526526
527527
Como se vê, `abc.Sized` reconhece `Struggle` como uma `subclasse`, sem necessidade de registro, já que implementar o método especial chamado `+__len__+` é o suficiente (o método deve ser implementado com a sintaxe e semântica corretas - deve poder ser chamado sem argumentos e retornar um inteiro não-negativo indicando o "comprimento" do objeto; mas qualquer código que implemente um método com nome especial, como `+__len__+`, com uma sintaxe e uma semântica arbitrárias e incompatíveis tem problemas muitos maiores que esses).
528528
529-
Então, aqui está minha mensagem de despedida: sempre que você estiver implementando uma classe que incorpore qualquer dos conceitos representados nas ABCs de `number`, `collections.abc` ou em outra framework que estiver usando, se assegure (caso necessário) de ser uma subclasse ou de registrar sua classe com a ABC correspondente. No início de seu programa usando uma biblioteca ou framework que definam classes que omitiram esse passo, registre você mesmo as classes. Daí, quando precisar verificar se (tipicamente) um argumento é, por exemplo, "uma sequência", verifique se:
529+
Então, aqui está minha mensagem de despedida: sempre que você estiver implementando uma classe que incorpore qualquer dos conceitos representados nas ABCs de `number`, `collections.abc` ou em outro framework que estiver usando, se assegure (caso necessário) de ser uma subclasse ou de registrar sua classe com a ABC correspondente. No início de seu programa usando uma biblioteca ou framework que definam classes que omitiram esse passo, registre você mesmo as classes. Daí, quando precisar verificar se (tipicamente) um argumento é, por exemplo, "uma sequência", verifique se:
530530
[source, python3]
531531
----
532532
isinstance(the_arg, collections.abc.Sequence)
@@ -578,7 +578,7 @@ Durante o processo de revisão do _Python Fluente_, Alex me enviou uma email:
578578

579579
[quote]
580580
____
581-
ABCs servem para encapsular conceitos muito genéricos, abstrações, introduzidos por uma framework - coisa como "uma sequência" e "um número exato".
581+
ABCs servem para encapsular conceitos muito genéricos, abstrações introduzidos por um framework - coisa como "uma sequência" e "um número exato".
582582
[Os leitores] quase certamente não precisam escrever alguma nova ABC, apenas usar as já existentes de forma correta, para obter 99% dos benefícios sem qualquer risco sério de design mal-feito.
583583
____
584584

@@ -1834,7 +1834,7 @@ Eu também aprendi bastante em seu post
18341834
https://fpy.li/13-43["Interfaces and Protocols"] (EN) ("Interfaces e Protocolos"),
18351835
comparando `typing.Protocol` com `zope.interface` — um mecanismo mais antigo para definir interfaces em sistemas plug-in fracamente acoplados, usado no
18361836
https://fpy.li/13-44[Plone CMS],
1837-
na https://fpy.li/13-45[Pyramid web framework], e na framework de programação assíncrona
1837+
na https://fpy.li/13-45[Pyramid web framework], e no framework de programação assíncrona
18381838
https://fpy.li/13-46[Twisted],
18391839
um projeto fundado por Glyph.footnote:[Agradeço ao revisor técnico Jürgen Gmach por ter recomentado o post "Interfaces and Protocols".]
18401840

capitulos/cap16.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ A seção https://docs.python.org/pt-br/3/reference/expressions.html#unary-arith
9191

9292
O pass:[<a href="https://docs.python.org/pt-br/3/reference/datamodel.html#object.__neg__">capítulo "Modelo de Dados"</a>] de _A Referência da Linguagem Python_ também inclui a função embutida `abs()` como um operador unário. O método especial associado é `+__abs__+`, como já vimos.
9393

94-
É fácil suportar operadores unários. Basta implementar o método especial apropriado, que receberá apenas um argumento: `self`. Use a lógica que fizer sentido na sua classe, mas se atenha à regra geral dos operadores: sempre devolva um novo objeto. Em outras palavras, não modifique o destinatário (`self`), crie e devolva uma nova instância do tipo adequado.
94+
É fácil suportar operadores unários. Basta implementar o método especial apropriado, que receberá apenas um argumento: `self`. Use a lógica que fizer sentido na sua classe, mas se atenha à regra geral dos operadores: sempre devolva um novo objeto. Em outras palavras, não modifique o receptor (`self`), crie e devolva uma nova instância do tipo adequado.
9595

96-
No caso de `-` e `+`, o resultado será provavelmente uma instância da mesma classe de `self`. Para o `+` unário, se o destinatário for imutável você deveria devolver `self`; caso contrário, devolva uma cópia de `self`.
96+
No caso de `-` e `+`, o resultado será provavelmente uma instância da mesma classe de `self`. Para o `+` unário, se o receptor for imutável você deveria devolver `self`; caso contrário, devolva uma cópia de `self`.
9797
Para `abs()`, o resultado deve ser um número escalar.
9898

9999
Já no caso de `~`, é difícil determinar o que seria um resultado razoável se você não estiver lidando com bits de um número inteiro.

capitulos/cap17.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2102,16 +2102,16 @@ que no fim precisa ser controlada por algum código não-trivial, como mostra o
21022102
21032103
Os exemplos anteriores mostram que o uso direto de corrotinas é incômodo e confuso.
21042104
Acrescente o tratamento de exceções e o método de corrotina `.throw()`, e os exemplos ficam ainda mais complicados.
2105-
Não vou tratar de `.throw()` nesse livro porque—como `.send()`—ele só é útil para controlar corrotinas "manualmente", e não recomendo fazer isso, a menos que você esteja criando uma nova framework baseada em corrotinas do zero .
2105+
Não vou tratar de `.throw()` nesse livro porque—como `.send()`—ele só é útil para controlar corrotinas "manualmente", e não recomendo fazer isso, a menos que você esteja criando um novo framework baseado em corrotinas do zero .
21062106
21072107
[NOTE]
21082108
====
21092109
Se você estiver interessado em um tratamento mais aprofundado de corrotinas clássicas—incluindo o método `.throw()`—por favor veja
21102110
https://fpy.li/oldcoro["Classic Coroutines" (_Corrotinas Clássicas_)] (EN) no site que acompanha o livro, pass:[<a href="http://fluentpython.com" class="orm:hideurl"><em>fluentpython.com</em></a>].
2111-
Aquele texto inclui pseudo-código similar ao Python detalhando como `yield from` controla geradoras e corrotinas, bem como uma pequena simulação de eventos discretos, demonstrando uma forma de concorrência usando corrotinas sem uma framework de programação assíncrona.
2111+
Aquele texto inclui pseudo-código similar ao Python detalhando como `yield from` controla geradoras e corrotinas, bem como uma pequena simulação de eventos discretos, demonstrando uma forma de concorrência usando corrotinas sem um framework de programação assíncrona.
21122112
====
21132113
2114-
Na prática, realizar trabalho produtivo com corrotinas exige o suporte de uma framework especializada.
2114+
Na prática, realizar trabalho produtivo com corrotinas exige o suporte de um framework especializada.
21152115
É isso que `asyncio` oferecia para corrotinas clássicas lá atrás, no Python 3.3.
21162116
Com o advento das corrotinas nativas no Python 3.5, os desenvolvedores principais do Python estão gradualmente eliminando o suporte a corrotinas clássicas no `asyncio`.
21172117
Mas os mecanismos subjacentes são muito similares.

0 commit comments

Comments
 (0)