Skip to content

Commit 67ac275

Browse files
committed
fixed better_code section
1 parent aeb3871 commit 67ac275

File tree

10 files changed

+284
-87
lines changed

10 files changed

+284
-87
lines changed

.vscode/settings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@
1414
"files.exclude": {
1515
"**/__pycache__": true
1616
},
17+
"cSpell.language": "en,it,lorem,en-US,en-GB"
1718
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Bandit
2+
3+
Bandit è uno strumento per trovare problemi di sicurezza più comuni all’interno del codice Python.
4+
5+
Utilizzandolo così com’è però, senza un’adeguata configurazione, fornisce anche un po' di falsi positivi.
6+
7+
Spendendo un po' di tempo a configurarlo correttamente per i vostri progetti è possibile avere informazioni utili riguardo:
8+
9+
- utilizzo insicuro di alcuni moduli
10+
- possibili SQL Injection
11+
- se il codice ignora silenziosamente alcune eccezioni
12+
- e molto altro
13+
14+
È un utilissimo strumento soprattutto per principianti per revisionare il proprio codice.
15+
16+
Per usare bandit il consiglio è quello di installare l’estensione di Flake8 `flake8-bandit` in modo da non dover installare e usare bandit separatamente, ma integrandolo direttamente nel vostro progetto.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Black
2+
3+
Black è un code formatter, prende i propri files e li formatta in accordo con PEP8 e PEP257 con alcune altre regole addizionali (ad esempio converte apostrofo singolo in apostrofo doppio).
4+
5+
Permette di essere configurato (ad esempio mettendo `--skip-string-**normalization` per preservare gli apostrofi singoli).
6+
7+
Black è uno strumento molto discusso e a volte molto aggressivo, ma usandolo in un team consente di uniformare la scrittura del codice rendendolo comune.
8+
9+
Installare e usare Black
10+
11+
```bash
12+
#installare black
13+
pip install black
14+
15+
#tuttavia è consigliato utilizzare pipx
16+
pipx install black
17+
```
18+
19+
Formattare un progetto
20+
21+
```bash
22+
black my_project #my_project = folder di progetto
23+
```
24+
25+
Inoltre è possibile impostare black su vscode in modo da configurare lo styling al salvataggio
26+
27+
Per farlo è necessario andare nelle impostazioni (settings) e modificare l’impostazione: format on save, in particolare:
28+
29+
```bash
30+
python: formatting provider
31+
```
32+
33+
Dai un'occhiata a questa guida per approfondire:
34+
35+
[https://marcobelo.medium.com/setting-up-python-black-on-visual-studio-code-5318eba4cd00](https://marcobelo.medium.com/setting-up-python-black-on-visual-studio-code-5318eba4cd00)
Lines changed: 1 addition & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,4 @@
1-
---
2-
title: Code style
3-
disquis: PythonBiellaGroup
4-
timetoread: true
5-
---
6-
7-
## Intro
8-
9-
Quando si lavora su progetti e si conivide il codice con un team di lavoro è importante cercare di mantenere uno stesso stile di scrittura del codice in modo da uniformarsi ed evitare di fraintendersi.
10-
11-
In Python esistono:
12-
13-
- PEP8 = Default python style guide
14-
- PEP257 = Docstring style guide
15-
16-
Alcuni esempi di PEP8:
17-
18-
- Quando spazi si usano per l’indentazione = 4 spazi
19-
- Come indentare le parentesi
20-
- Lunghezza della linea di codice predefinita (79 caratteri per il codice e 72 caratteri per i commenti e docstrings)
21-
- Come configurare gli import
22-
-
23-
24-
Tuttavia nonostante le linee guida di PEP8 ci sono molte cose su cui di può discutere e che non sono chiare, lasciando spesso anche troppa libertà.
25-
26-
Ecco che entrano in gioco alcune librerie che aiutano nella gestione della qualità del codice.
27-
28-
---
29-
30-
## Black
31-
32-
Black è un code formatter, prende i propri files e li formatta in accordo con PEP8 e PEP257 con alcune altre regole addizionali (ad esempio converte apostrofo singolo in apostrofo doppio).
33-
34-
Permette di essere configurato (ad esempio mettendo `--skip-string-**normalization` per preservare gli apostrofi singoli).
35-
36-
Black è uno strumento molto discusso e a volte molto aggressivo, ma usandolo in un team consente di uniformare la scrittura del codice rendendolo comune.
37-
38-
Installare e usare Black
39-
40-
```bash
41-
#installare black
42-
pip install black
43-
44-
#tuttavia è consigliato utilizzare pipx
45-
pipx install black
46-
```
47-
48-
Formattare un progetto
49-
50-
```bash
51-
black my_project #my_project = folder di progetto
52-
```
53-
54-
Inoltre è possibile impostare black su vscode in modo da configurare lo styling al salvataggio
55-
56-
Per farlo è necessario andare nelle impostazioni (settings) e modificare l’impostazione: format on save, in particolare:
57-
58-
```bash
59-
python: formatting provider
60-
```
61-
62-
Dai un'occhiata a questa guida per approfondire:
63-
64-
[https://marcobelo.medium.com/setting-up-python-black-on-visual-studio-code-5318eba4cd00](https://marcobelo.medium.com/setting-up-python-black-on-visual-studio-code-5318eba4cd00)
65-
66-
---
67-
68-
## Flake8
1+
# Flake8
692

703
Oltre agli strumenti che consentono di formattare il codice in Python esistono diversi linter e analizzatori statici di codice.
714

@@ -146,22 +79,3 @@ Ci sono tantissimi altri strumenti che consentono di controllare il codice e di
14679
- prospector
14780

14881
Tuttavia vi consiglio di utilizzare Flake8 e Blake nei vostri progetti e di inserire anche Bandit
149-
150-
---
151-
152-
## Bandit
153-
154-
Bandit è uno strumento per trovare problemi di sicurezza più comuni all’interno del codice Python.
155-
156-
Utilizzandolo così com’è però, senza un’adeguata configurazione, fornisce anche un po' di falsi positivi.
157-
158-
Spendendo un po' di tempo a configurarlo correttamente per i vostri progetti è possibile avere informazioni utili riguardo:
159-
160-
- utilizzo insicuro di alcuni moduli
161-
- possibili SQL Injection
162-
- se il codice ignora silenziosamente alcune eccezioni
163-
- e molto altro
164-
165-
È un utilissimo strumento soprattutto per principianti per revisionare il proprio codice.
166-
167-
Per usare bandit il consiglio è quello di installare l’estensione di Flake8 `flake8-bandit` in modo da non dover installare e usare bandit separatamente, ma integrandolo direttamente nel vostro progetto.
File renamed without changes.

docs/learning/better_code/index.md

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
---
2+
title: Code style
3+
disquis: PythonBiellaGroup
4+
timetoread: true
5+
---
6+
7+
## Intro
8+
9+
Quando si lavora su progetti e si condivide il codice con un team di lavoro è importante cercare di mantenere uno stesso stile di scrittura del codice in modo da uniformarsi ed evitare di fraintendersi.
10+
11+
È anche importante cercare di **aderire a degli standard di programmazione** in modo tale da facilitare la condivisione del codice all'interno dello stesso gruppo di lavoro e dello stesso ambiente, facendo in modo di controllare anche altri aspetti correlati come la qualità del codice, la sicurezza, i test, ...
12+
13+
In Python in particolare esistono delle linee guida chiamati PEP che sono accettati ed implementati:
14+
15+
- PEP8 = [Default python style guide](https://peps.python.org/pep-0008/)
16+
- PEP257 = [Docstring style guide](https://peps.python.org/pep-0257/)
17+
- Typings PEPs = [Tutto ciò che riguarda i typings](https://peps.python.org/topic/typing/)
18+
- PEP 483 = [Theory dei Type hints](https://peps.python.org/pep-0483/)
19+
- PEP 482 = [Overview della letterature per i Type Hints](https://peps.python.org/pep-0482/)
20+
- PEP 483 = [Letteratura dei Type Hints](https://peps.python.org/pep-0483/)
21+
22+
Esistono tuttavia degli altri PEP accettati, ma non ancora implementati che definiscono altre linee guida che non tratteremo qui in questa guida. Ci sono anche degli altri PEP aperti in cui è ancora in corso una discussione, anche questi non verranno trattati qui.
23+
24+
Come puoi vedere in queste linee guida vengono anche regolati tantissimi aspetti non solamente legati allo styling, ma anche come vengono espressi i tipi di variabili, come si scrive i codici, standard e policy.
25+
26+
Siccome questi concetti sono molto importanti all'interno dell'ecosistema di Python e Python è un linguaggio così importante nel mondo moderno, nel corso del tempo sono nate delle vere e proprie organizzazioni Open Source che si occupano di sviluppare, mantenere e aggiornare strumenti utili per controllare tutte queste regole, meccanismi e aspetti...come ad esempio la [Python Code Quality Authority](https://github.com/PyCQA)
27+
28+
### Alcuni esempi di PEP8
29+
30+
- Quando spazi si usano per l’indentazione = 4 spazi
31+
- Come indentare le parentesi
32+
- Lunghezza della linea di codice predefinita (79 caratteri per il codice e 72 caratteri per i commenti e docstring)
33+
- Come configurare gli import
34+
- Naming convention
35+
36+
Le linee guida di PEP8 sono volutamente spesso vaghe, libere ad interpretazione e non chiare, lasciando spesso anche troppa libertà. Se questo da un lato è un vantaggio essendo Python un linguaggio molto libero, utilizzato da tantissime persone molto variegate in tanti ambienti di versi.
37+
38+
Una volta comprese le linee guida dobbiamo trovare il modo di metterle in pratiche in modo da rendere facile la gestione del codice all'interno del nostro progetto.
39+
40+
## Naming convention
41+
42+
Forse il punto più dolente e meno rispettato quando si deve scrivere del codice in Python, è proprio la convenzione dei nomi.
43+
44+
In generale ci sono delle regole principali che possono cambiare a seconda degli stili:
45+
46+
- Usare la formulazione `snake_case` per moduli, variabili, attributi, funzioni, nomi dei metodi
47+
- Usare `CamelCase` per nomi delle classi e Fabrics
48+
- I nomi devono essere chiari rispetto a quello che una variable, una classe, una funzione contiene o fa, non preoccupatevi di avere nomi lunghi, anzi...spesso è meglio avere un nome più lungo piuttosto che uno troppo breve e poco espressivo
49+
- Non includere mai il tipo di una variabile nel suo nome, ad esempio scrivere: `senders` invece di `sender_list` o `senderlist`
50+
51+
Ti lasciamo un [bell'articolo di blog](https://luminousmen.com/post/the-ultimate-python-style-guidelines) che spiega anche questi concetti con alcuni esempi.
52+
53+
### Nomi dei moduli
54+
55+
I nomi dei moduli possono essere tutti in minuscolo oppure avere delle iniziali maiuscolo
56+
57+
Ad esempio:
58+
59+
- con le iniziali maiuscole: `MyModule`
60+
- tutto minuscolo: `mymodule`
61+
62+
Generalmente i moduli che contengono solamente funzioni hanno nomi completamente in minuscolo. Comunque, quando si ha a che fare con dei veri e propri pacchetti, allora il nome dovrebbe essere tutto minuscolo.
63+
64+
### Nomi delle classi
65+
66+
I nomi delle Classi hanno le iniziali maiuscole, tipo `MyClass`.
67+
68+
### Nomi delle funzioni
69+
70+
I nomi delle funzioni possono essere espressi in due modi principalmente:
71+
72+
- con le iniziali maiuscole: `MyFunction`
73+
- tutto minuscolo: `myfunction`
74+
- con sottolineature per indicare gli spazi: `my_function`
75+
76+
Anche per i metodi delle classi seguono queste logiche di naming convention. Solo per i **metodi interni** o per le **variabili di istanza** sarebbe preferibile aggiungere un carattere di sottolineatura all'inizio del nome, come ad esempio: `_my_internal_method`.
77+
78+
Questo per evitare conflitti di nome che si potrebbero generare all'interno del progetto.
79+
80+
È tuttavia d'obbligo utilizzare due sottolineature per gli attributi e le funzioni a cui solo la classe corrente possa accedere, ovvero tutto ciò che è "privato", come ad esempio: `__my_private_method`. Questo ci ricorda che questi attributi, metodi e funzioni all'interno delle classi sono private e dovrebbero essere accessibili solamente all'interno della classe stessa e non all'esterno.
81+
82+
## Styling guides
83+
84+
Ovviamente nel mondo esistono delle linee guida più concrete utilizzate da diversi programmatori, come ad esempio la Google Style Guide per Python che viene utilizzata anche da molti tools all'interno dei vari IDE di programmazione (esempio: alcune estensioni su VSCode).
85+
86+
Ci sono anche delle ottime alternative community based, come nel case del libro Hitchhiker's guide to Python di cui consigliamo la lettura.
87+
88+
- [Google python style guide](https://google.github.io/styleguide/pyguide.html)
89+
- [The hitchhiker's guide to python](https://docs.python-guide.org/writing/style/)
90+
91+
## Come fare?
92+
93+
Ecco che entrano in gioco alcune librerie che aiutano nella gestione del codice da diversi punti di vista:
94+
95+
- Stile del codice
96+
- Qualità del codice
97+
- Problemi di sicurezza
98+
- Check dei typings
99+
100+
Alcune librerie descritte in questi capitoli che possono aiutarti a configurare il tuo progetto sono:
101+
102+
- **Black**: Uno dei più famosi auto code formatter in Python che in automatico cerca di forzare l'uso di PEP8 all'interno del progetto, noi lo usiamo molto, è molto aggressivo, ma fa bene il suo lavoro e aiuta molto nelle repository con tante persone.
103+
- **Bandit**: Uno strumento disegnato per trovare problemi di sicurezza comuni all'interno del codice Python. È mantenuto dalla [Python Code Quality Authority](https://github.com/PyCQA) ed è rilasciato come strumento open source.
104+
- **Flake8**: libreria molto famosa che consente di forzare alcune regole di stile, può essere esteso utilizzando dei plugin ed è anche questo uno strumento mantenuto dalla [Python Code Quality Authority](https://github.com/PyCQA).
105+
- **Isort**: Una utility Python che consente di organizzare in modo alfabetico gli imports all'interno di un file.
106+
- **Mypy**: Uno strumento che consente di controllare lo static type checker, è stato molto usato nel passato, ma il suo sviluppo e supporto ha avuto problemi nel corso del tempo. Ultimamente è stato rimpiazzato da strumenti più efficienti e migliori, come ad esempio: Ruff.
107+
- **Pylint**: Un linter e un code static analysis tool per Python. Uno strumento molto potente incluso anche come estensione all'interno di diversi IDE come VSCode o Pycharm.
108+
- **Ruff**: Un nuovo linter e code formatter scritto in Rust. Ruff è diventato nel corso degli ultimi anni uno standard abbastanza affermato con una rapidissima adozione da parte delle aziende e dai gruppi di lavoro. È molto potente, facilmente estendibile, molto efficace e personalizzabile.
109+
110+
Ti ricordiamo che all'interno della nostra [repository Bear](https://github.com/PythonBiellaGroup/Bear) puoi trovare questi tool e librerie già configurate con una configurazione standard.
111+
112+
Questi strumenti possono essere utilizzati anche all'interno delle pipeline di CI/CD per controllare che tutto sia conforme rispetto alle regole di progetto prima che il codice venga rilasciato nella repository o pushato in una branch.
113+
114+
Per questo tipo di configurazione rimandiamo al capitolo dedicato a `pre-commit` che puoi trovare nella nostra sezione Learning.
115+
116+
## Typings
117+
118+
È necessario fare un piccolo approfondimento su cosa sono i **typings** su Python prima di introdurre strumenti come **pylint**, **mypy**, **ruff**.
119+
120+
Python è un linguaggio dinamico, che vuol dire che non ci sono dei requisiti formali per rappresentare il tipo delle variabili, dei dati, delle informazioni o degli oggetti (ad esempio se una variabile è un intero). Questa flessibilità consente di essere molto veloci e rapidi nella scrittura del codice, dando al programmatore molta libertà, soprattutto in alcuni contesti come l'analisi dei dati, il machine learning, lo scripting generico. Ci sono anche dei contro però, come ad esempio la risoluzione dei tipi: per capire il tipo di una variabile Python deve eseguire degli algoritmi che pur troppo sono molto lenti e questa è una delle critiche che maggiormente vengono fatte al linguaggio, ovvero che spesso, per alcuni tipi di compiti, risulta lento.
121+
122+
Al contrario i linguaggio staticamente tipizzati o fortemente tipizzati non possono cambiare il loro tipo durante l'esecuzione, ma sono molto più veloci, ma allo stesso tempo offrono meno libertà.
123+
124+
Tuttavia negli ultimi anni Python supporta i **Type Hints** ovvero delle annotazioni che possono essere date alle variabili, consentendo di controllare che il codice rispetti questi criteri, soprattutto per motivi di test e di verifica del codice.
125+
Questa definizione di **type hints** viene regolata dal [PEP 484](https://peps.python.org/pep-0484/)
126+
127+
Se volessimo fare un esempio di una funzione e di alcune variabili, questo è come appare il typings su Python.
128+
129+
```python
130+
constant: int = 42
131+
def adding_two_numbers(num1: int, num2: int) -> int:
132+
return num1 + num2 + constant
133+
```
134+
135+
Come potete vedere vengono suggeriti i tipi nelle variabili del metodo, in modo che quando lo richiami puoi sapere a quali tipi ti stai riferendo, viene suggerito anche il tipo in uscita in modo da sapere quale tipo di dato ti aspetti in output dalla funzione.
136+
137+
Python attraverso il modulo **typing** offre anche la possibilità di specificare degli altri tipi che non siano quelli base, come ad esempio: liste, tuple, dizionari, ...
138+
139+
```python
140+
from typing import List, Tuple, Dict, Any
141+
142+
# List of integers
143+
numbers: List[float] = [1.1, 2.2, 3.3, 4.4]
144+
145+
# Dictionary with string keys and integer values
146+
ages: Dict[str, int] = {'Pippo': 21, 'Pluto': 28, 'Paperino': 24}
147+
148+
# Tuple of string and string (tuple have the same type internally)
149+
numbers: Tuple[int, int, int] = (2, 4, 8)
150+
151+
# Any type, basically not specifying the type
152+
data: Any = 123
153+
154+
```
155+
156+
Sempre utilizzando lo stesso modulo si possono anche creare i propri tipi.
157+
158+
```python
159+
from typing import List
160+
161+
class Superhero:
162+
def __init__(self, name: str, age: int, city: str, power: float):
163+
self.name = name
164+
self.age = age
165+
self.city = city
166+
self.power = power
167+
168+
# Avengers: a list of Superhero objects
169+
Avengers: List[Superhero] = [
170+
Superhero('Cpt. America', 33, 'Brooklyn', 7.8),
171+
Superhero('Thor', 77, 'Asgard', 8.9),
172+
Superhero('Hulk', 40, 'America', 10),
173+
]
174+
```
175+
176+
Per facilitare il controllo e l'uso dei **type hints** per controllare che tutto rispetti la definizione sono nati nel corso del tempo diverse librerie, tool e pacchetti che consentono anche di estendere queste definizioni, in particolare:
177+
178+
- Mypy
179+
- Ruff
180+
- Pylint
181+
- Pydantic
182+
183+
### Pro e contro dei typings
184+
185+
Ovviamente non è sempre tutto oro quel che luccica :) Pur troppo l'utilizzo dei Type Hints non aiuta Python ad essere più veloce, tuttavia possiamo comunque evidenziare dei pro e contro.
186+
187+
#### Pro
188+
189+
- Aiuta il linting e consente di ridurre la possibilità di avere dei bug nel codice
190+
- Aiuta tantissimo la leggibilità e la documentazione del codice, ci sono strumenti che consentono di generare automaticamente documentazione a partire dai type hints.
191+
- Consente di avere una fase di testing molto più approfondita e fatta bene.
192+
- Diventa più facile scrivere codice perchè i moderni IDE sono in grado di suggerire anche il tipo di dato che è necessario in una classe o in una funzione quando viene richiamata.
193+
- Risolve il problema dei `None-awareness`, ovvero non solo non possiamo passare dei tipi sbagliati alle funzioni o agli oggetti, ma non possiamo passare valori che possono essere `None` causando numerosi problemi.
194+
195+
#### Contro
196+
197+
- Bisogna spendere più tempo nella scrittura del codice e nell'implementazione degli hints
198+
- A volte non è facile identificare i tipi giusti, specialmente con oggetti complessi all'interno di grandi repository
199+
- Cambiando versioni di Python o delle librerie a supporto possono esserci degli errori di retro compatibilità
200+
- Utilizzando librerie aggiuntive, come ad esempio **pylint**, ci si lega molto alla libreria e non si usa nativamente il linguaggio, portando anche qui a problemi di incompatibilità tra le diverse versioni.
201+
202+
### Documentazione
203+
204+
Per altri riferimenti e guide riguardo ai Type Hints lasciamo qui alcuni blog e guide che a noi hanno aiutato molto
205+
206+
- [Python type checking guide](https://realpython.com/python-type-checking/)
207+
- [Official python page for type hints](https://docs.python.org/3/library/typing.html)
208+
- [Static typing with Python](https://typing.readthedocs.io/en/latest/)
209+
- [Does python need types?](https://tushar.lol/post/does-python-need-types/)
210+
211+
## Altro materiale
212+
213+
Oltre alle librerie di Python e ai diversi Styling guides, vi consigliamo anche queste letture che possono essere interessanti se dovete cercare di portare un po' di standardizzazione all'interno dei vostri progetti nella vostra azienda.
214+
215+
Bellissimo articolo di Real Python su [come scrivere bel codice Python seguendo PEP8](https://realpython.com/python-pep8/)
216+
217+
Best practice per [Python Code Quality](https://realpython.com/python-code-quality/) sempre scritto dalla community di RealPython.
218+
219+
Elenco dei [PEP di Python](https://peps.python.org/pep-0000/)

0 commit comments

Comments
 (0)