Skip to content

Commit 8cccafc

Browse files
committed
cap23: revisão de estilo pronta
1 parent 9e7d201 commit 8cccafc

6 files changed

Lines changed: 251 additions & 146 deletions

File tree

code/23-descriptor/descriptorkinds.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,7 @@
138138
139139
"""
140140

141-
# tag::DESCR_KINDS[]
142-
143-
### auxiliary functions for display only ###
141+
# tag::DESCR_KINDS_AUX[]
144142

145143
def cls_name(obj_or_cls):
146144
cls = type(obj_or_cls)
@@ -161,8 +159,9 @@ def print_args(name, *args):
161159
pseudo_args = ', '.join(display(x) for x in args)
162160
print(f'-> {cls_name(args[0])}.__{name}__({pseudo_args})')
163161

162+
# end::DESCR_KINDS_AUX[]
164163

165-
### essential classes for this example ###
164+
# tag::DESCR_KINDS[]
166165

167166
class Overriding: # <1>
168167
"""a.k.a. data descriptor or enforced descriptor"""

code/23-descriptor/method_is_descriptor.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
Text('drawkcab')
1111
>>> type(Text.reverse), type(word.reverse) # <4>
1212
(<class 'function'>, <class 'method'>)
13-
>>> list(map(Text.reverse, ['repaid', (10, 20, 30), Text('stressed')])) # <5>
14-
['diaper', (30, 20, 10), Text('desserts')]
13+
>>> [Text.reverse(x) for x in ['abc', (1, 2), Text('stressed')]] # <5>
14+
['cba', (2, 1), Text('desserts')]
1515
>>> Text.reverse.__get__(word) # <6>
1616
<bound method Text.reverse of Text('forward')>
1717
>>> Text.reverse.__get__(None, Text) # <7>
18-
<function Text.reverse at 0x101244e18>
18+
<function Text.reverse at 0x...>
1919
>>> word.reverse # <8>
2020
<bound method Text.reverse of Text('forward')>
2121
>>> word.reverse.__self__ # <9>
@@ -33,7 +33,7 @@
3333
class Text(collections.UserString):
3434

3535
def __repr__(self):
36-
return 'Text({!r})'.format(self.data)
36+
return f'Text({self.data!r})'
3737

3838
def reverse(self):
3939
return self[::-1]

links/FPY.LI.htaccess

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,3 +1478,6 @@ RedirectTemp /c4 https://docs.python.org/pt-br/3/library/functions.html#type
14781478
# cap21: appended 2026-02-06
14791479
RedirectTemp /c5 https://fastapi.tiangolo.com/pt/project-generation/
14801480
RedirectTemp /c6 https://pypi.org/project/curio-compat/
1481+
1482+
# cap22: appended 2026-02-11
1483+
RedirectTemp /c7 https://docs.python.org/pt-br/3.10/reference/datamodel.html#implementing-descriptors

online/cap22.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1585,7 +1585,7 @@ um_objeto.contagem += 1
15851585
um_objeto.set_contagem(um_objeto.get_contagem() + 1)
15861586
----
15871587
1588-
Algumas vezes, ao projetar uma API, me pergunto se todo método que não recebe qualquer argumento (além de `self`), devolve um valor (diferente de `None`) e é uma função pura (isto é, não tem efeitos colaterais) não deveria ser substituído por uma propriedade somente de leitura. Neste capítulo, o método `LineItem.subtotal` (no <<lineitem_class_v2prop_class>>) seria um bom candidato a se tornar uma propriedade somente para leitura. Claro, isso exclui métodos projetados para modificar o objeto, tal como `my_list.clear()`. Seria uma péssima ideia transformar isso em uma propriedade, de tal forma que o mero acesso a `my_list.clear` apagaria o conteúdo da lista!
1588+
Algumas vezes, ao projetar uma API, me pergunto se todo método que não recebe argumentos (além de `self`) é uma função pura (isto é, devolve um valor mas não tem efeitos colaterais) não deveria ser substituído por uma propriedade somente de leitura. Neste capítulo, o método `LineItem.subtotal` (no <<lineitem_class_v2prop_class>>) seria um bom candidato a se tornar uma propriedade somente para leitura. Claro, isso exclui métodos projetados para modificar o objeto, tal como `my_list.clear()`. Seria uma péssima ideia transformar isso em uma propriedade, de tal forma que o mero acesso a `my_list.clear` apagaria o conteúdo da lista!
15891589
15901590
Na biblioteca GPIO https://fpy.li/22-29[_Pingo_] (mencionada na <<missing_method>>), da qual sou co-autor, grande parte da API do usuário está baseada em propriedades. Por exemplo, para ler o valor atual de uma porta analógica, o usuário escreve `pin.value`, e definir o modo de uma porta digital é escrito `pin.mode = OUT`. Por trás da cortina, ler o valor de uma porta analógica ou definir o modo de uma porta digital pode implicar em bastante código, dependendo do driver específico da placa. Decidimos usar propriedades no Pingo porque queríamos que a API fosse confortável de usar até mesmo em ambientes interativos como um Jupyter Notebook, e achamos que `pin.mode = OUT` é mais fácil para os olhos e para os dedos que `pin.set_mode(OUT)`.
15911591

0 commit comments

Comments
 (0)