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

2.229 visualizações

Publicada em

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).

Publicada em: Tecnologia
1 comentário
4 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
2.229
No SlideShare
0
A partir de incorporações
0
Número de incorporações
6
Ações
Compartilhamentos
0
Downloads
46
Comentários
1
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

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

×