Salta ai contenuti

Progetti Python

Il generatore di progetti Python può essere utilizzato per creare una moderna libreria o applicazione Python configurata con le migliori pratiche, gestita con UV, un singolo file di lock e un ambiente virtuale in un workspace UV, pytest per l’esecuzione dei test, Ruff per l’analisi statica, e ty per il controllo dei tipi.

Puoi generare un nuovo progetto Python in due modi:

  1. Installa il Nx Console VSCode Plugin se non l'hai già fatto
  2. Apri la console Nx in VSCode
  3. Clicca su Generate (UI) nella sezione "Common Nx Commands"
  4. Cerca @aws/nx-plugin - py#project
  5. Compila i parametri richiesti
    • Clicca su Generate
    Parametro Tipo Predefinito Descrizione
    name Obbligatorio string - Il nome del progetto Python
    directory string packages Directory principale dove viene posizionato il progetto.
    subDirectory string - La sottodirectory in cui viene posizionato il progetto. Per impostazione predefinita corrisponde al nome del progetto.
    projectType Obbligatorio string application Se il progetto è un'applicazione o una libreria
    moduleName string - Nome del modulo Python

    Il generatore creerà la seguente struttura del progetto nella directory <directory>/<name>:

    • Directory<module-name>
      • __init__.py Inizializzazione modulo
    • Directorytests
      • __init__.py Inizializzazione modulo
      • conftest.py Configurazione test
      • test_noop.py Test segnaposto
    • project.json Configurazione progetto e target di build
    • pyproject.toml File di configurazione packaging utilizzato da UV
    • .python-version Contiene la versione Python del progetto

    Potresti anche notare i seguenti file creati/aggiornati nella root del workspace:

    • pyproject.toml Configurazione packaging a livello workspace per UV
    • .python-version Contiene la versione Python del workspace
    • uv.lock File di lock per le dipendenze Python

    Aggiungi il tuo codice sorgente Python nella directory <module-name>.

    Importare il Codice della Libreria in Altri Progetti

    Sezione intitolata “Importare il Codice della Libreria in Altri Progetti”

    Utilizza il target add per aggiungere una dipendenza a un progetto Python.

    Supponiamo di aver creato due progetti Python, my_app e my_lib. Questi avranno nomi progetto completamente qualificati my_scope.my_app e my_scope.my_lib, e per default avranno nomi modulo my_scope_my_app e my_scope_my_lib.

    Per far dipendere my_app da my_lib, possiamo eseguire il comando:

    Terminal window
    pnpm nx run my_scope.my_app:add my_scope.my_lib

    Potrai quindi importare il codice della libreria:

    packages/my_app/my_scope_my_app/main.py
    from my_scope_my_lib.my_module import my_function

    Qui sopra, my_scope_my_lib è il nome modulo della libreria, my_module corrisponde a un file sorgente Python my_module.py, e my_function è un metodo definito in quel file.

    Per aggiungere dipendenze al tuo progetto, puoi eseguire il target add nel tuo progetto Python, ad esempio:

    Terminal window
    pnpm nx run my_scope.my_library:add some-pip-package

    Questo aggiungerà la dipendenza al file pyproject.toml del progetto e aggiornerà il root uv.lock.

    Quando utilizzi il tuo progetto Python come codice runtime (ad esempio come handler per una funzione AWS lambda), dovrai creare un bundle del codice sorgente e di tutte le sue dipendenze. Puoi ottenere questo aggiungendo un target come il seguente al tuo file project.json:

    project.json
    {
    ...
    "targets": {
    ...
    "bundle": {
    "cache": true,
    "executor": "nx:run-commands",
    "outputs": ["{workspaceRoot}/dist/packages/my_library/bundle"],
    "options": {
    "commands": [
    "uv export --frozen --no-dev --no-editable --project packages/my_library --package my_scope.my_library -o dist/packages/my_library/bundle/requirements.txt",
    "uv pip install -n --no-deps --no-installer-metadata --no-compile-bytecode --python-platform x86_64-manylinux_2_28 --python `uv python pin` --target dist/packages/my_library/bundle -r dist/packages/my_library/bundle/requirements.txt"
    ],
    "parallel": false
    },
    "dependsOn": ["compile"]
    },
    },
    }

    Il tuo progetto Python è configurato con un target build (definito in project.json), che puoi eseguire tramite:

    Terminal window
    pnpm nx build <project-name>

    Dove <project-name> è il nome completamente qualificato del tuo progetto.

    Il target build compilerà, eseguirà il linting, testerà e controllerà i tipi del progetto.

    L’output della build si troverà nella cartella root dist del workspace, all’interno di una directory per il tuo package e target, ad esempio dist/packages/<my-library>/build

    Per compilare tutti i progetti nel tuo workspace, esegui:

    Terminal window
    pnpm nx run-many --target build

    Oppure usa il comando abbreviato:

    Terminal window
    pnpm build

    pytest è configurato per testare il tuo progetto.

    I test dovrebbero essere scritti nella directory test all’interno del progetto, in file Python prefissati con test_, ad esempio:

    • Directorymy_library
      • my_module.py
    • Directorytests
      • test_my_module.py Test per my_module.py

    I test sono metodi che iniziano con test_ e fanno asserzioni per verificare le aspettative, ad esempio:

    tests/test_my_module.py
    from my_library.my_module import say_hello
    def test_say_hello():
    assert say_hello("Darth Vader") == "Hello, Darth Vader!"

    Per maggiori dettagli su come scrivere test, consulta la documentazione pytest.

    I test verranno eseguiti come parte del target build del progetto, ma puoi anche eseguirli separatamente con il target test:

    Terminal window
    pnpm nx test <project-name>

    Puoi eseguire un singolo test o una suite di test usando il flag -k, specificando il nome del file test o del metodo:

    Terminal window
    pnpm nx test <project-name> -k 'test_say_hello'

    I progetti Python utilizzano ty per il controllo dei tipi.

    Il controllo dei tipi viene eseguito come parte del target build del progetto, ma puoi anche eseguirlo separatamente tramite il target typecheck:

    Terminal window
    pnpm nx run <project-name>:typecheck

    Per sopprimere una diagnostica specifica per una singola riga, aggiungi un commento # ty: ignore[<rule>] alla fine della riga, ad esempio:

    value: int = "not an int" # ty: ignore[invalid-assignment]

    Per configurare il comportamento del controllo dei tipi nel tuo progetto, aggiungi una sezione [tool.ty] al file pyproject.toml del progetto. Consulta il riferimento alla configurazione di ty per le opzioni disponibili.

    I progetti Python utilizzano Ruff per il linting.

    Per invocare il linter e controllare il progetto, puoi eseguire il target lint:

    Terminal window
    pnpm nx lint <project-name>

    La maggior parte dei problemi di linting o formattazione può essere corretta automaticamente. Puoi chiedere a Ruff di correggere i problemi eseguendo con l’argomento --configuration=fix:

    Terminal window
    pnpm nx lint <project-name> --configuration=fix

    Analogamente, se vuoi correggere tutti i problemi di linting in tutti i package del workspace, puoi eseguire:

    Terminal window
    pnpm nx run-many --target lint --all --configuration=fix

    Per evitare che i problemi di linting ti rallentino durante lo sviluppo (in particolare se hai problemi non correggibili automaticamente nel tuo progetto), puoi eseguire una build con la configurazione skip-lint:

    Terminal window
    pnpm nx run-many --target build --configuration=skip-lint

    Questo eseguirà comunque Ruff come parte della build, ma il target lint sarà sempre considerato riuscito.