Your SlideShare is downloading. ×

Coisas que até Guido duvida: Metaprogramação em Python

1,779
views

Published on

Faça o Python ser como você quiser (ou quase)! Uso de técnicas como sobrecarga de operadores, lambdas, frame hacks, __getattr__ e outras, para a criação de DSLs ou qualquer outra coisa que exija …

Faça o Python ser como você quiser (ou quase)! Uso de técnicas como sobrecarga de operadores, lambdas, frame hacks, __getattr__ e outras, para a criação de DSLs ou qualquer outra coisa que exija extrair o máximo da linguagem. Estudo de caso com a ferramenta Should-DSL (http://www.should-dsl.info).

Published in: Technology

1 Comment
1 Like
Statistics
Notes
No Downloads
Views
Total Views
1,779
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
41
Comments
1
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Coisas que até Guido duvida: Metaprogramação em Python Rodrigo S. Manhães Núcleo de Pesquisa em Sistemas de Informação/IFF Laboratório de Ciências Matemáticas/UENF Gerência de Recursos Computacionais/UENF
  • 2. metaprogramação http://www.flickr.com/photos/lwr/12364944/
  • 3. importante técnica de projeto de software?
  • 4. importante técnica de projeto de software? buzzword da moda?
  • 5. metaprogramação não é uma teoria abstrata
  • 6. metaprogramação não é uma teoria abstrata é uma técnica concreta e pragmática
  • 7. criação facilitada de wrappers e proxies
  • 8. criação de DSLs
  • 9. remover duplicação de código
  • 10. C++ http://www.flickr.com/photos/dmitryboyko/332537891
  • 11. Ruby http://www.flickr.com/photos/nataliemaynor/2539111053
  • 12. metaprogramação é a escrita de código que manipula construtos da linguagem em tempo de execução
  • 13. domain specific languages
  • 14. make CSS SQL Ruby on Rails Django Elixir
  • 15. http://www.flickr.com/photos/clover_1/176047283
  • 16. http://www.flickr.com/photos/ysc/2179798100
  • 17. concisão
  • 18. HTML
  • 19. HTML Python
  • 20. HTML Python
  • 21. HTML Python
  • 22. concisão fluência
  • 23. Django
  • 24. concisão fluência expressividade
  • 25. unittest
  • 26. unittest should-dsl
  • 27. should-dsl expectativas para testes e especificações automatizadas Http://www.should-dsl.info http://github.com/hugobr/should-dsl
  • 28. anatomia de uma expectativa
  • 29. iteração #1
  • 30. iteração #1
  • 31. iteração #2
  • 32. O que é isso?
  • 33. O que é isso? e isso?
  • 34. iteração #2
  • 35. iteração #2
  • 36. sobrecarga de operadores
  • 37. sobrecarga de operadores
  • 38. ...entre outros
  • 39. iteração #2
  • 40. iteração #3
  • 41. sobrecarga #wtf
  • 42. ...entre outros operadores “right”
  • 43. sobrecarga de operadores
  • 44. iteração #3
  • 45. iteração #4
  • 46. iteração #4 o teste quebra!
  • 47. iteração #4 o teste quebra! should_be é implementado com is
  • 48. iteração #4 o teste quebra! should_be é implementado com is precisamos de um “should equal”
  • 49. iteração #4
  • 50. iteração #4
  • 51. iteração #4 (retrospectiva)
  • 52. você é um fanfarrão!
  • 53. copy&paste-oriented programming
  • 54. iteração #5
  • 55. property permite executar um método usando uma sintaxe de acesso a atributo
  • 56. property sua principal finalidade é fornecer acesso “gerenciado” a atributos
  • 57. property
  • 58. lambda permite definir uma expressão que será avaliada posteriormente (lazy evaluation)
  • 59. lambda equivalente em tudo a uma função, mas
  • 60. lambda equivalente em tudo a uma função, mas sem nome
  • 61. lambda equivalente em tudo a uma função, mas sem nome definida inline, + simples e direta
  • 62. lambda equivalente em tudo a uma função, mas sem nome definida inline, + simples e direta aceita apenas uma expressão
  • 63. lambda
  • 64. iteração #5
  • 65. iteração #5 (retrospectiva)
  • 66. iteração #5 (retrospectiva) __ror__
  • 67. iteração #5 (retrospectiva) __or____ror__
  • 68. iteração #5 (retrospectiva) objeto
  • 69. iteração #5 (retrospectiva) objeto property
  • 70. iteração #6 criação de novo matcher implica alteração na classe Should
  • 71. iteração #6 e se um testador precisar de um matcher para o seu domínio?
  • 72. iteração #6 e se um testador precisar de um matcher para o seu domínio? altera o código e reaplica suas alterações a cada nova versão de Should?
  • 73. iteração #6 precisamos de matchers customizados!!
  • 74. concisão fluência expressividade extensibilidade
  • 75. iteração #6
  • 76. decorator
  • 77. decorator função que recebe uma função como parâmetro
  • 78. decorator função que recebe uma função como parâmetro @possui_sintaxe_especial
  • 79. decorator função que recebe uma função como parâmetro @possui_sintaxe_especial mas é uma função como qq outra
  • 80. decorator Havendo 50 equivale a 51 + 52
  • 81. property brota do nada??
  • 82. respondendo a mensagens perdidas
  • 83. iteração #6
  • 84. iteração #6
  • 85. iteração #7 como implementar expectativas como “pedido deve ter 10 itens” quando pedido é um objeto e itens é um atributo de pedido que é uma lista que possui 10 elementos?
  • 86. iteração #7
  • 87. iteração #7
  • 88. iteração #7 e coisas como:
  • 89. http://www.flickr.com/photos/mukluk/241256203
  • 90. iteração #7
  • 91. iteração #7
  • 92. iteração #7 sim, isto é possível!
  • 93. iteração #7 sim, isto é possível! mas talvez não desejável... pelo menos não assim
  • 94. iteração #7 então, por que não...
  • 95. iteração #7 então, por que não...
  • 96. iteração #7 então, por que não...
  • 97. esta nova sintaxe...
  • 98. esta nova sintaxe... isola should
  • 99. esta nova sintaxe... isola should permite matchers tão complexos quanto necessário
  • 100. esta nova sintaxe... isola should permite matchers tão complexos quanto necessário libera cada matcher para ser, potencialmente, uma DSL por si só
  • 101. iteração #7
  • 102. __call__
  • 103. __call__ qualquer objeto pode ser chamado, como uma função
  • 104. __call__ qualquer objeto pode ser chamado, como uma função ou seja, pode ser um “callable”
  • 105. __call__ qualquer objeto pode ser chamado, como uma função ou seja, pode ser um “callable” basta definir o método __call__
  • 106. iteração #7
  • 107. iteração #7 mas eu não quero ter que importar cada matcher!!
  • 108. iteração #7 mas eu não quero ter que importar cada matcher!! claro, a ideia é essa mesmo! só importar should e mais nada!
  • 109. MAS COMO? http://www.flickr.com/photos/33370236@N06/3912980456
  • 110. frame hack código que acessa ou modifica frame objects
  • 111. frame hack
  • 112. frame hack
  • 113. frame hack
  • 114. iteração #7
  • 115. iteração #8
  • 116. getattr getattr permite obter o valor de um atributo cujo nome é dado por uma string
  • 117. getattr
  • 118. iteração #8
  • 119. iteração #9
  • 120. iteração #9
  • 121. http://www.flickr.com/photos/waldopepper/3424717308
  • 122. Exemplos do início (div tag, Django) extraídos de: http://media.brianbeck.com/files/Python_DSLs_I.pdf
  • 123. eu na web Github: http://github.com/rodrigomanhaes Slideshare: http://www.slideshare.net/rodrigomanhaes Twitter: @rodrigomanhaes Blog: http://programacaoradical.blogspot.com Blog não técnico: http://fanatismoindeciso.blogspot.com E-mail: rmanhaes@gmail.com