Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
434 commits
Select commit Hold shift + click to select a range
f5724ba
correcoes finais
cordjr Feb 19, 2016
b47fe2f
Merge pull request #241 from cordjr/pelican
Feb 19, 2016
d4e9685
Update paralelismo_em_python_usando_concurrent_futures.md
luzfcb Feb 19, 2016
59d4bd9
Minor fixes in typos & style
cuducos Feb 19, 2016
ce07a69
Merge pull request #242 from cuducos/pelican
luzfcb Feb 19, 2016
40595f0
add generator image
andrealmar Feb 19, 2016
aa25844
add python generators blogpost
andrealmar Feb 19, 2016
795e53b
added MacOs files
andrealmar Feb 19, 2016
6ef878f
image optimized as requested
andrealmar Feb 19, 2016
9aa5c3a
Merge pull request #243 from andrealmar/pelican
luzfcb Feb 19, 2016
77b2cd4
adição de notas sobre a versão do python utilizada e da lib
cordjr Feb 19, 2016
e81ccaa
Merge pull request #244 from cordjr/pelican
luzfcb Feb 19, 2016
91441fc
Update paralelismo_em_python_usando_concurrent_futures.md
luzfcb Feb 19, 2016
368f1e4
fixing a few typos
andrealmar Feb 20, 2016
5ca2c77
Merge pull request #245 from andrealmar/pelican
Feb 20, 2016
53e734a
Merge remote-tracking branch 'pythonclub/pelican' into pelican
cordjr Feb 22, 2016
b2450d3
Minor minor type correction
cordjr Feb 23, 2016
281acbf
Merge pull request #246 from cordjr/pelican
luzfcb Feb 24, 2016
f0dba24
Post sobre modos de leitura em uploads
cuducos Feb 26, 2016
e3cfe9d
Merge pull request #248 from cuducos/pelican
luzfcb Feb 27, 2016
5a48e35
Update upload-de-arquivos-no-django-entendo-os-modos-de-leitura.md
luzfcb Feb 27, 2016
3a8147a
Typo
cuducos Feb 27, 2016
d3c9b7a
Merge pull request #250 from cuducos/pelican
luzfcb Feb 27, 2016
a751aa8
Fix WTTD link
cuducos Feb 29, 2016
98775cf
Merge pull request #251 from cuducos/post-django-upload
Feb 29, 2016
f3b2ae1
Fix typo
rg3915 Mar 3, 2016
4bfa0ea
Merge pull request #253 from rg3915/pelican
luzfcb Mar 3, 2016
ac83de7
adicionando alias [skip ci]
luzfcb Mar 3, 2016
00526d8
adicionado pelican-alias [skip ci]
luzfcb Mar 3, 2016
275f3fb
habilitando pelican_alias
luzfcb Mar 3, 2016
9334882
adicionado fork com correcao do plugin pelican-alias
luzfcb Mar 4, 2016
17fa58e
adicionado registro automatico do sitemap.xml no google e bing
luzfcb Mar 4, 2016
03d4e34
corrigido alias no artigo para a url com a ortografia correta
luzfcb Mar 4, 2016
11ce5cc
renomeado arquivo artigo Eduardo Cuducos
luzfcb Mar 4, 2016
50b85f8
Novo post: TDD com Python e Flask
cuducos Mar 14, 2016
7aa41d3
Merge pull request #254 from cuducos/pelican
Mar 14, 2016
d08c3cc
Remove título (duplicado) e corrige erro de digitação
cuducos Mar 14, 2016
6f64f4e
Merge pull request #255 from cuducos/pelican
luzfcb Mar 14, 2016
21fb67b
Update tdd-com-python-e-flask.md
cuducos Mar 14, 2016
fe4ca20
Merge pull request #256 from cuducos/pelican
luzfcb Mar 14, 2016
7e732d3
Atualizando post
rg3915 Apr 21, 2016
f08381f
Merge pull request #258 from rg3915/pelican
luzfcb Apr 21, 2016
8e85015
adicionado texto explicit is better than implicit
ivancrneto Apr 22, 2016
137b796
adicionando informacoes de autor e metadados
ivancrneto Apr 22, 2016
a0b2535
removendo pequeno espaco
ivancrneto Apr 22, 2016
13bd4c7
Merge pull request #259 from ivancrneto/explicit-better-implicit
Apr 23, 2016
e2417dd
Django Rest Framework Serialization
rg3915 Apr 24, 2016
3543b0e
Merge pull request #260 from rg3915/pelican
luzfcb Apr 24, 2016
c7b12dd
postagem sites estáticos com lektor
humrochagf Apr 30, 2016
47434f8
Merge pull request #261 from humrochagf/pelican
luzfcb Apr 30, 2016
a137f5a
Update django version
rg3915 May 2, 2016
6938355
Merge pull request #262 from rg3915/pelican
luzfcb May 2, 2016
246937e
postagem ghpages com pelican
humrochagf May 5, 2016
607c4fb
Merge pull request #264 from humrochagf/pelican
luzfcb May 5, 2016
e49ebf6
Update README.md
luzfcb May 5, 2016
5e0bf76
[NEW] Post: python-com-unittest-travis-e-coveralls-parte-1-de-4
mstuttgart May 6, 2016
941d29d
Merge pull request #265 from mstuttgart/post/python-com-unittest-trav…
luzfcb May 6, 2016
dec4496
[NEW] Novo post: python-com-unittest-travis-e-coveralls-parte-2-de-4
mstuttgart May 8, 2016
a817418
[FIX] Imagens do post centralizadas
mstuttgart May 8, 2016
87857e0
Merge pull request #266 from mstuttgart/post/python-com-unittest-trav…
luzfcb May 8, 2016
465d7ae
[NEW] folder com imagens para meu usuario
mstuttgart May 9, 2016
ad86684
[FIX] Atualizado postagens para que usem imagens locais
mstuttgart May 9, 2016
777d354
[FIX] badge centralizada na pagina
mstuttgart May 9, 2016
a3fd9ba
Merge pull request #267 from mstuttgart/fix/add_personal_image_folder
luzfcb May 9, 2016
8f1ab02
[NEW] postagem python-com-unittest-travis-ci-coveralls-e-landscape-pa…
mstuttgart May 12, 2016
0b5af86
[FIX] Ajuste nas postagens
mstuttgart May 13, 2016
85ff3e5
[FIX] Imagens do post centralizadas
mstuttgart May 13, 2016
0f85657
Merge pull request #268 from mstuttgart/post/python-com-unittest-trav…
luzfcb May 13, 2016
8c95ea6
atualizada data de publicação artigo testes c/ travis
luzfcb May 13, 2016
9a965f2
Update extraindo_texto_de_imagens_com_python.md
luzfcb May 13, 2016
ced8cb4
[FIX] Correções nas minhas postagens sobre unittest
mstuttgart May 19, 2016
cc38fbb
[NEW] Postagem python-com-unittest-travis-ci-coveralls-e-landscape-pa…
mstuttgart May 19, 2016
35440e1
Merge pull request #269 from mstuttgart/post/python-com-unittest-trav…
luzfcb May 19, 2016
ea73f3c
[FIX] Atualizado endereco do site do autor
mstuttgart May 24, 2016
a811bb4
Merge pull request #270 from mstuttgart/fix/dominio-site-autor
luzfcb May 24, 2016
6e26e4a
Url atualizada das postagens sobre unittest.
mstuttgart Jun 2, 2016
015a0ac
[NEW] Postagem Gerando relatorios de teste com Coveralls
mstuttgart Jun 2, 2016
1ebe00f
[FIX] Imagens otimizadas
mstuttgart Jun 3, 2016
a5842e6
Curso asyncio - Aula 00
carlosmaniero Jun 3, 2016
e66716e
Mais informações sobre o vídeo
carlosmaniero Jun 3, 2016
8fc86d7
Merge pull request #271 from mstuttgart/post/gerando-relatorios-de-te…
luzfcb Jun 3, 2016
6238c0e
Merge pull request #272 from carlosmaniero/pelican
raphapassini Jun 5, 2016
a45d2ac
Create curso-asyncio-aula1.rst
carlosmaniero Jun 11, 2016
fa547e0
Update date
carlosmaniero Jun 11, 2016
9aec270
Merge pull request #274 from carlosmaniero/pelican
luzfcb Jun 11, 2016
e0968fa
Novo post: Python, webassets & Elm
cuducos Jun 14, 2016
719f51e
Typos
cuducos Jun 15, 2016
b610a1b
[NEW] post como-distribuir-seu-projeto-python-com-pypi
mstuttgart Jun 16, 2016
8245327
Merge pull request #275 from cuducos/pelican
igr-santos Jun 16, 2016
ac42a58
Typos
cuducos Jun 15, 2016
c55b754
Remove duplicated heading
cuducos Jun 16, 2016
a3637a5
Fix merge conflicts
cuducos Jun 17, 2016
27cde16
Merge pull request #277 from cuducos/pelican
luzfcb Jun 17, 2016
f271388
Fix wrong variable name in the TDD with Flask tutorial
cuducos Jun 17, 2016
19db800
Merge pull request #278 from cuducos/pelican
cuducos Jun 17, 2016
7bc4fab
Merge pull request #276 from mstuttgart/post/como-distribuir-seu-proj…
luzfcb Jun 17, 2016
5e5b3a0
Update como-distribuir-seu-projeto-python-com-pypi.md
mstuttgart Jun 17, 2016
f479ff6
Merge pull request #279 from mstuttgart/removendo_imagem
luzfcb Jun 17, 2016
b4ff131
add primeira parte do artigo.
Oct 23, 2016
4cb503b
Update and rename bot-telegram-e-web-scrpagin.md to bot-telegram-e-we…
Oct 24, 2016
48e7cdb
Update bot-telegram-e-web-scraping.md
Oct 24, 2016
8efb9ee
Update bot-telegram-e-web-scraping.md
Oct 24, 2016
b48d183
Update bot-telegram-e-web-scraping.md
Oct 24, 2016
522c5f2
Update bot-telegram-e-web-scraping.md
Oct 24, 2016
be87d93
Merge pull request #280 from Pedro-Souza/pelican
luzfcb Oct 29, 2016
c7fc27e
Update and rename bot-telegram-e-web-scraping.md to bot-telegram-e-we…
luzfcb Oct 29, 2016
5ae283a
Update bot-telegram-e-web-scraping-parte1.md
luzfcb Oct 29, 2016
2264089
Deploy simples e rápido com dokku
juniorcarvalho Nov 23, 2016
18b05fa
Merge pull request #281 from juniorcarvalho/pelican
Nov 26, 2016
e6f2378
adicionado debugging-logging.md
BrunoLSA Nov 27, 2016
08c6113
Merge pull request #282 from BrunoLSA/pelican
luzfcb Nov 27, 2016
10489bf
Corrigindo identação
rg3915 Nov 28, 2016
bb1e06d
Merge pull request #283 from rg3915/pelican
luzfcb Nov 28, 2016
fa4927f
Create abrangencia-de-listas-e-dicionarios.md
mstuttgart Jan 16, 2017
a92a5a1
Merge pull request #284 from mstuttgart/pelican
Jan 16, 2017
61a441b
Pequena correção do ortografia, em 15/02/2017
weltonvaz Feb 16, 2017
4264dc5
Merge pull request #285 from weltonvaz/pelican
luzfcb Feb 16, 2017
a3c829c
Post escrevi meu primeiro artigo em 15/02/2017
weltonvaz Feb 16, 2017
7ce3290
Merge pull request #286 from weltonvaz/pelican
luzfcb Feb 23, 2017
bf5c012
Correções gramaticais
rg3915 Feb 28, 2017
357d046
Merge pull request #287 from rg3915/pelican
luzfcb Feb 28, 2017
28fbec0
Starting What The Flask pt 4 e 5 :)
rochacbruno Apr 21, 2017
efb6ef7
Criando a extensao pt 1
rochacbruno Apr 22, 2017
3152f7f
Merge pull request #288 from nenodias/pelican
luzfcb Apr 23, 2017
4583d63
Adicionando post sobre como configurar o openshift + flask + gunicor …
nenodias Apr 23, 2017
26a06a0
Atualizando e deixando <app-name> visivel
Apr 24, 2017
40d04d7
Merge pull request #289 from nenodias/pelican
luzfcb Apr 24, 2017
4741843
Quase pronto! Extensão escrita!
rochacbruno Apr 25, 2017
7865de7
Finally WTF 4 is finished!
rochacbruno Apr 26, 2017
7769bf7
Atualizado TOC dos artigos anterios e update notes
rochacbruno Apr 26, 2017
484f451
Merge pull request #290 from rochacbruno/wtf4
luzfcb Apr 26, 2017
64eed1e
HOTFIX no WTF 1 por causa de mudança em multithreading X flask X dataset
rochacbruno May 18, 2017
20a6c69
Merge pull request #291 from rochacbruno/wtf_1_hotfix
luzfcb May 18, 2017
311ab27
Create peewee-um-orm-python-minimalista.md
mstuttgart Jul 20, 2017
3970083
Merge pull request #292 from mstuttgart/mstuttgart-peewee-orm-python
luzfcb Jul 20, 2017
57a2a82
programação funcional com python #0
dunossauro Nov 14, 2017
02d6ce8
arrumando diretório copiado
dunossauro Nov 14, 2017
6454c81
Merge pull request #293 from z4r4tu5tr4/pelican
luzfcb Nov 20, 2017
612b7b1
atualizado data de publicação
luzfcb Nov 20, 2017
8c4cbfb
diminuido imagem lambda
luzfcb Nov 20, 2017
74c56fc
Programação funcional parte 2; funções
dunossauro Dec 8, 2017
9c35f98
Merge branch 'pelican' into pelican
dunossauro Dec 8, 2017
ec31b3f
Merge branch 'pelican' into pelican
dunossauro Dec 8, 2017
0138ef9
Correção do slug para travis ci
dunossauro Dec 8, 2017
ed858e6
Ajustes dos links do youtube nas postagens de programação funcional
dunossauro Dec 8, 2017
e296192
Merge branch 'pelican' of https://github.com/z4r4tu5tr4/pythonclub.gi…
dunossauro Dec 8, 2017
c1969db
Merge pull request #295 from z4r4tu5tr4/pelican
luzfcb Dec 8, 2017
622ca45
Update README.md
luzfcb Dec 8, 2017
ac1123d
Programação funcional #2 iteraveis e iteradores
dunossauro Dec 19, 2017
26de385
atualizado data/hora publicacao
luzfcb Dec 24, 2017
3e23253
Merge pull request #296 from z4r4tu5tr4/pelican
luzfcb Dec 24, 2017
665d3eb
DRF Quickstart atualizado
rg3915 Feb 14, 2018
20ad06b
DRF Serialization atualizado
rg3915 Feb 14, 2018
3e1c7a6
Django Rest Framework - #2 Requests and Responses
rg3915 Feb 14, 2018
8262298
Django Rest Framework - #3 Class Based Views
rg3915 Feb 14, 2018
9fed88c
Merge pull request #297 from rg3915/pelican
luzfcb Feb 14, 2018
cf92a01
Mais links
rg3915 Feb 14, 2018
3acf179
Merge pull request #298 from rg3915/pelican
luzfcb Feb 14, 2018
33dc79b
Monitoramento ARP
kanazux May 15, 2018
41fa67d
Merge pull request #299 from kanazux/add_monitoramento_arp
luzfcb May 15, 2018
c89ace9
corrigido link para artigo do Pedro Werneck
luzfcb May 16, 2018
636b3fc
Add upload arquivo socket struct
kanazux May 17, 2018
0c5de03
Fixed word struct
kanazux May 17, 2018
38d8c2c
Merge pull request #300 from kanazux/add_socket_struct
luzfcb May 17, 2018
d96b36b
Atualizando o post Introdução a Classes e Métodos
grandeportal May 23, 2018
1b78d69
Mais um update.
grandeportal May 25, 2018
1c94d52
fix typo.
grandeportal May 25, 2018
0465352
Merge pull request #301 from rg3915/pelican
luzfcb May 27, 2018
f344e25
Fix typo
grandeportal May 28, 2018
7d9cbef
Merge pull request #302 from rg3915/pelican
luzfcb May 28, 2018
c5c9f5d
pequenas correções ortográficas
newtonjgaliza Jun 11, 2018
8f5e84f
Merge pull request #303 from NewtonGaliza/pelican
luzfcb Jun 11, 2018
8e03384
Publicação sobre operadores ternários (ou expressões condicionais).
Otoru Oct 6, 2018
b2b1768
Correções de texto.
Otoru Oct 6, 2018
ba9d617
COrreção ortográfica.
Otoru Oct 6, 2018
f5b85d3
Merge pull request #304 from Otoru/operadores_ternarios_no_python
luzfcb Oct 6, 2018
c5fba1f
Update requirements.txt
luzfcb Oct 8, 2018
dc63e6a
Post about sorting algorithms
Nov 20, 2018
fcc80a7
Merge pull request #305 from LucasMagnum/pelican
luzfcb Nov 20, 2018
9beea7d
Update post with new video about merge sort
Nov 29, 2018
07d590a
Merge pull request #306 from LucasMagnum/pelican
luzfcb Nov 29, 2018
03bb6aa
Tutorial Django 2.2
rg3915 Jun 24, 2019
4e57c46
Ajustes na descrição "do que vc precisa"
rg3915 Jun 24, 2019
a6d3749
Python 3.6 ou superior
rg3915 Jun 24, 2019
ad12cda
Comentários.
rg3915 Jun 24, 2019
07d03e6
fix typo
rg3915 Jun 24, 2019
4d6a1f5
Merge pull request #308 from rg3915/pelican
luzfcb Jun 24, 2019
df64dc8
Post sobre criacao de dicts em Python
mstuttgart Oct 1, 2019
eb0b926
Atualiza cabeçalho dos posts
mstuttgart Oct 1, 2019
84626fc
Atualiza 'abrangencia-de-listas-e-dicionarios.md'
mstuttgart Oct 1, 2019
4b3dfe9
Atualiza 'gerando-relatorios-de-teste-com-coveralls.md'
mstuttgart Oct 1, 2019
e26ddb5
Atualiza 'peewee-um-orm-python-minimalista.md'
mstuttgart Oct 1, 2019
8335850
Atualiza 'python-com-unittest-travis-e-coveralls-parte-1-de-4.md'
mstuttgart Oct 1, 2019
5ccde03
Atualiza 'python-com-unittest-travis-e-coveralls-parte-2-de-4.md'
mstuttgart Oct 1, 2019
2b602f9
Atualiza 'python-com-unittest-travis-ci-coveralls-e-landscape-parte-3…
mstuttgart Oct 1, 2019
306b892
Atualiza 'python-com-unittest-travis-ci-coveralls-e-landscape-parte-4…
mstuttgart Oct 1, 2019
69b5157
Merge pull request #309 from mstuttgart/criando-dicts
luzfcb Oct 1, 2019
d8985f2
Update content/abrangencia-de-listas-e-dicionarios.md
mstuttgart Oct 1, 2019
9620e94
Merge pull request #310 from mstuttgart/atualiza-dados
luzfcb Oct 1, 2019
d5d74ea
Add article about CI with Github Actions
Jan 24, 2020
d336cf7
Merge pull request #311 from LucasMagnum/pelican
luzfcb Jan 24, 2020
3516b53
Initial post JacksonOsvaldo
JacksonOsvaldo Oct 28, 2020
2120e37
Initial post JacksonOsvaldo
JacksonOsvaldo Oct 28, 2020
45a04ef
Revert "Initial post JacksonOsvaldo"
JacksonOsvaldo Oct 28, 2020
0fd41f1
Revert "Initial post JacksonOsvaldo"
JacksonOsvaldo Oct 28, 2020
b7e6986
Initial commit JacksonOsvaldo
JacksonOsvaldo Oct 28, 2020
a27e090
Merge pull request #312 from JacksonOsvaldo/pelican
luzfcb Oct 30, 2020
260d5f5
Update fazendo-backup-do-banco-de-dados-no-django.md
luzfcb Oct 30, 2020
10ae04b
Update README.md
luzfcb Nov 5, 2020
5838c6f
Adiciona artigo: Encapsulamento da lógica do algoritmo
eduardoklosowski Mar 2, 2021
6a9abb5
Merge pull request #313 from eduardoklosowski/artigo
luzfcb Mar 2, 2021
36366ce
Adiciona artigo: Funções in place ou cópia de valor
eduardoklosowski Mar 29, 2021
5bd008b
Merge pull request #314 from eduardoklosowski/artigo
erichideki Mar 29, 2021
626bae2
Correção do artigo: Funções in place ou cópia de valor
eduardoklosowski Apr 5, 2021
f48a3d0
Merge pull request #315 from eduardoklosowski/fix-artigo
luzfcb Apr 5, 2021
0ad9af4
Adiciona artigo: Orientação a objetos de outra forma: Classes e objetos
eduardoklosowski Apr 12, 2021
b1e3fee
Merge pull request #316 from eduardoklosowski/artigo
luzfcb Apr 12, 2021
755c5fc
Adiciona artigo: Orientação a objetos de outra forma: Métodos estátic…
eduardoklosowski Apr 19, 2021
588aef7
Merge pull request #317 from eduardoklosowski/artigo
luzfcb Apr 20, 2021
08a013d
Adiciona artigo: Orientação a objetos de outra forma: Herança
eduardoklosowski Apr 26, 2021
154cb3e
Adiciona artigo: Orientação a objetos de outra forma: Herança múltipl…
eduardoklosowski May 3, 2021
bf9732b
Merge pull request #318 from eduardoklosowski/artigo
luzfcb May 3, 2021
6975bca
Adiciona artigo: Orientação a objetos de outra forma: ABC
eduardoklosowski May 10, 2021
08840ea
Merge pull request #319 from eduardoklosowski/artigo
luzfcb May 11, 2021
13d2735
Adiciona artigo: Orientação a objetos de outra forma: Property
eduardoklosowski May 17, 2021
bd43c28
Merge pull request #320 from eduardoklosowski/artigo
luzfcb May 17, 2021
0c13067
Adiciona post sobre a Python Brasil 2021
Aug 2, 2021
e305d86
Merge pull request #321 from rafpyprog/pybr2021
luzfcb Aug 2, 2021
421390a
Adiciona artigo: Questões para estudo de algoritmos
eduardoklosowski Oct 17, 2022
62471ee
Merge pull request #324 from eduardoklosowski/artigo
luzfcb Oct 30, 2022
25364d9
Adiciona action para publicar o site no pages
eduardoklosowski Jan 10, 2023
42e5e9e
Adiciona action para testar o build de novos artigos
eduardoklosowski Jan 10, 2023
f5726b0
Merge pull request #325 from eduardoklosowski/actions
luzfcb Feb 6, 2023
d2c86cb
Update questoes-para-estudo-de-algoritmos.md
luzfcb Feb 6, 2023
f758bdc
Update questoes-para-estudo-de-algoritmos.md
luzfcb Feb 6, 2023
e356f86
Update fork_clone_push_pull-request.rst
luzfcb Feb 6, 2023
30250e3
move to HTTPS
luzfcb Feb 28, 2023
56de5ba
Adiciona artigo: Testando código que chama serviços da AWS
eduardoklosowski Oct 28, 2025
3ed6e92
Merge pull request #329 from eduardoklosowski/artigo/testando-codigo-aws
luzfcb Oct 30, 2025
6c152b5
Initial plan
Copilot Oct 30, 2025
74d7780
Update GitHub Actions to latest versions while keeping Python 2.7
Copilot Oct 30, 2025
25ef23f
Merge pull request #332 from pythonclub/copilot/update-github-actions…
luzfcb Oct 30, 2025
f7d09cb
Initial plan
Copilot Oct 30, 2025
8a1b03b
Update GitHub Actions to use Python 3.5
Copilot Oct 30, 2025
3ea7c87
Update GitHub Actions versions in build-test.yml
Copilot Oct 30, 2025
bdec8e0
Trigger CI build
Copilot Oct 30, 2025
15290b4
Merge pull request #333 from pythonclub/copilot/update-github-actions…
luzfcb Oct 30, 2025
b71baea
Initial plan
Copilot Oct 30, 2025
51a6cad
Merge remote-tracking branch 'upstream/pelican' into copilot/update-w…
Copilot Oct 30, 2025
48ee71d
Update GitHub Actions workflows to use ubuntu-20.04 for Python 3.5 co…
Copilot Oct 30, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Build Test

on:
push:
branches:
- '*'
- '!pelican'

permissions:
contents: read

jobs:
build:
name: Build
runs-on: ubuntu-20.04
steps:
- name: Checkout do repositório
uses: actions/checkout@v5
with:
submodules: recursive

- name: Configura python
uses: actions/setup-python@v6
with:
python-version: "3.5"
cache: pip

- name: Instala dependências
run: pip install -r requirements.txt

- name: Build do site
run: make publish

55 changes: 55 additions & 0 deletions .github/workflows/github-pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: GitHub Pages

on:
push:
branches:
- pelican

permissions:
contents: read

concurrency:
group: pages
cancel-in-progress: true

jobs:
build:
name: Build
runs-on: ubuntu-20.04
steps:
- name: Checkout do repositório
uses: actions/checkout@v5
with:
submodules: recursive

- name: Configura python
uses: actions/setup-python@v6
with:
python-version: "3.5"
cache: pip

- name: Instala dependências
run: pip install -r requirements.txt

- name: Build do site
run: make publish

- name: Upload do site
uses: actions/upload-pages-artifact@v4
with:
path: output/

deploy:
name: Deploy
needs: build
permissions:
pages: write
id-token: write
runs-on: ubuntu-20.04
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy no GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,17 @@ Thumbs.db

# Cache files
cache/*

# Pycharm
.idea

# Virtualenv
venv/

MacOS Files
.DS_Store

# alias
src

.env
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ language: python
python:
- 2.7
install:
- pip install -r requirements.txt --use-mirrors
- pip install -r requirements.txt
script:
- make publish
notifications:
Expand All @@ -18,3 +18,4 @@ env:
before_install:
- git submodule update --remote --merge
after_success: bash deploy.sh

14 changes: 2 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[pythonclub.com.br][0]
======================
Duvidas sobre este projeto, deixe sua mensagem em [![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/pythonclub/pythonclub.github.io?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Duvidas sobre este projeto, deixe sua mensagem em [![Gitter](https://badges.gitter.im/pythonclub/pythonclub.github.io.svg)](https://gitter.im/pythonclub/pythonclub.github.io?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)

Blog colaborativo sobre tecnologias que envolvam a linguagem Python

Expand All @@ -11,7 +11,7 @@ Como Contribuir
* Faça um fork desse repositório, clicando no botão [![Fork][14]][15], na parte superior direita da pagina do Github
* Clone seu fork:

``git clone --recursive https://github.com/SEU_USUARIO_DO_GITHUB/pythonclub.github.io.git``
``git clone --depth 1 --recursive https://github.com/SEU_USUARIO_DO_GITHUB/pythonclub.github.io.git``

* Instale os requirements ``pip install -r requirements.txt`` - se você não tiver o pip instalado, instale-o: https://pip.pypa.io/en/latest/installing.html#install-pip
* Todas as publicações ficam na pasta ``content``, os textos podem ser escritos
Expand Down Expand Up @@ -80,16 +80,6 @@ Para finalizar o servidor use:

``./develop_server.sh stop``

Futuras Publicações
-------------------

Alguns dos contribuidores criaram o compromisso de publicar alguns artigos.

Foi estabelecido um prazo maximo para a entrega dos artigos com o intuito de que o contribuidor realmente publique o artigo com o conteudo que ele mesmo definiu.

Você pode ver a lista contendo os nomes dos artigos nesta planilha no [Google Drive][7].

Quando tiver um assunto e uma data de entrega, adicione na planinha, ao finalizar o seu artigo, envie o pull request e atualize a planilha marcando que sua publicação já foi entregue.

[0]: http://pythonclub.com.br/
[1]: https://pages.github.com/
Expand Down
197 changes: 197 additions & 0 deletions content/a-armadilha-dos-argumentos-com-valores-padrao.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
title: A armadilha dos argumentos com valores padrão
Slug: a-armadilha-dos-argumentos-com-valores-padrao
Date: 2015-06-07 11:00
Tags: python,mutable,function,class,anti-pattern
Author: Diego Garcia
Email: drgarcia1986@gmail.com
Github: drgarcia1986
Site: http://www.codeforcloud.info
Twitter: drgarcia1986
Linkedin: drgarcia1986
Category: anti-patterns


<figure style="float:left;">
<img src="/images/drgarcia1986/is_a_trap.png">
</figure>
</br>
Algo muito comum em várias linguagens de programação é a possibilidade de definir _valores default_ (valores padrão) para argumentos de funções e métodos, tornando a utilização desses opcional.
Isso é ótimo, principalmente para manter retrocompatibilidade, porém, o python possui uma pequena armadilha que caso passe despercebida, pode causar sérios problemas, muitas vezes difíceis de serem detectados.
Essa armadilha ocorre quando usamos valores de tipos `mutáveis` como valor default de argumentos.

<!-- MORE -->

### O que são tipos mutáveis e imutáveis?
Segundo a [documentação oficial do python](https://docs.python.org/3.4/reference/datamodel.html), o valor de alguns objetos pode mudar, esses objetos que podem ter seu valor alterado após serem criados são chamados de mutáveis, enquanto que os objetos que não podem ter seus valores alterados após serem criados são chamados de imutáveis (simples assim).

* **Tipos mutáveis**:

Listas, Dicionários e tipos definidos pelo usuário.

* **Tipos imutáveis**:

Numeros, Strings e Tuplas.

> Apesar de serem imutáveis, a utilização de um valor mutável (uma lista por exemplo) dentro de uma tupla, pode causar o efeito _[tuplas mutáveis](http://pythonclub.com.br/tuplas-mutantes-em-python.html)_, onde visualmente o valor da tupla é alterado, mas por trás dos panos o valor da tupla não muda, o que muda é o valor do objeto pelo qual a tupla está se referenciando.

### A armadilha
Como disse no começo desse blogpost, é muito comum a utilização de valores default em agurmentos de funções e métodos, por essa razão, nos sentimos seguros em fazer algo desse tipo:

```python
def my_function(my_list=[]):
my_list.append(1)
print(my_list)
```

Porém, levando esse exemplo em consideração, o que irá acontecer se invocarmos essa função 3 vezes?

```python
>>> my_function()
[1]
>>> my_function()
[1, 1]
>>> my_function()
[1, 1, 1]
```
Sim, o valor do argumento `my_list` mudou em cada vez que executamos a função sem passar algum valor para ele.

### Por que isso acontece?
Isso acontece porque o python processa os valores default de cada argumentos de uma função (ou método) quando essa for definida, após esse processamento o valor é atribuido ao objeto da função.
Ou seja, por questões de optimização, seguindo nosso exemplo, o python não cria uma lista vazia para o argumento `my_list` a cada vez que a função `my_function` for invocada, ele reaproveita uma lista que foi criada no momento em que essa função foi importada.

```python
>>> my_function.func_defaults
([],)
>>> id(my_function.func_defaults[0])
140634243738080
>>> my_function()
[1]
>>> my_function.func_defaults
([1],)
>>> id(my_function.func_defaults[0])
140634243738080
>>> my_function()
[1, 1]
>>> my_function.func_defaults
([1, 1],)
>>> id(my_function.func_defaults[0])
140634243738080
```
> Note que a identificação do argumento (no caso `my_list`) não muda, mesmo executando a função várias vezes.

Outro exemplo seria utilizar o resultado de funções como valores default de argumentos, por exemplo, uma função com um argumento que recebe como default o valor de `datetime.now()`.

```python
def what_time_is_it(dt=datetime.now()):
print(dt.strftime('%d/%m/%Y %H:%M:%S'))
```
O valor do argumento `dt` sempre será o _datetime_ do momento em que o python carregou a função e não o _datetime_ de quando a função foi invocada.

```python
>>> what_time_is_it()
07/06/2015 08:43:55
>>> time.sleep(60)
>>> what_time_is_it()
07/06/2015 08:43:55
```

### Isso também acontece com classes?
Sim e de uma forma ainda mais perigosa.

```python
class ListNumbers():
def __init__(self, numbers=[]):
self.numbers = numbers

def add_number(self, number):
self.numbers.append(number)

def show_numbers(self):
print(numbers)
```
Assim como no caso das funções, no exemplo acima o argumento `numbers` é definido no momento em que o python importa a classe, ou seja, a cada nova instância da classe `ListNumbers`, será aproveitada a mesma lista no argumento `numbers`.

```python
>>> list1 = ListNumbers()
>>> list2 = ListNumbers()
>>> list1.show_numbers()
[]
>>> list2.show_numbers()
[]
>>> list2.add_number(1)
>>> list1.show_numbers()
[1]
>>> list2.show_numbers()
[1]
>>> list1.numbers is list2.numbers
True
```

### Por que isso não acontece com Strings?
Porque strings são `imutáveis`, o que significa que a cada alteração de valor em uma variavel que armazena uma strings, o python cria uma nova instância para essa variável.

```python
>>> a = 'foo'
>>> id(a)
140398402003832
>>> a = 'bar'
>>> id(a)
140398402003872 # o penúltimo número muda :)
```

Em argumentos com valores default, não é diferente.

```
def my_function(my_str='abc'):
my_str += 'd'
print(my_str)
```
No exemplo acima, sempre que for executado o `inplace add` (`+=`) será criada outra váriavel para `my_str` sem alterar o valor default do argumento.

```python
>>> my_function()
abcd
>>> my_function.func_defaults
('abc',)
>>> my_function()
abcd
>>> my_function.func_defaults
('abc',)
```

### Como se proteger?
A maneira mais simples de evitar esse tipo de surpresa é utilizar um [valor sentinela](http://en.wikipedia.org/wiki/Sentinel_value) como por exemplo `None`, nos argumentos opcionais que esperam tipos mutáveis:

```python
def my_function(my_list=None):
if my_list is None:
my_list = []
my_list.append(1)
print(my_list)
```

Ou, para deixar o código ainda mais elegante, podemos simplificar a condicional com um simples `or`:

```python
def my_function(my_list=None):
my_list = my_list or []
my_list.append(1)
print(my_list)
```
> Obrigado [Bruno Rocha](http://pythonclub.com.br/author/bruno-cezar-rocha.html) pela sugestão.

Pronto, sem surpresas e sem armadilhas :).

```python
>>> my_function()
[1]
>>> my_function()
[1]
>>> my_function()
[1]
```

### Referências

* [Fluent Python (Mutable types as parameter defaults: bad idea)](http://shop.oreilly.com/product/0636920032519.do)
* [Python Anti-Patterns (Using a mutable default value as an argument)](http://docs.quantifiedcode.com/python-anti-patterns/correctness/mutable_default_value_as_argument.html)
Loading