Projetos Python
O gerador de projetos Python pode ser usado para criar uma biblioteca ou aplicação Python moderna configurada com as melhores práticas, gerenciada com UV, um único lockfile e ambiente virtual em um workspace UV, pytest para executar testes, Ruff para análise estática, e ty para verificação de tipos.
Gerar um Projeto Python
Seção intitulada “Gerar um Projeto Python”Você pode gerar um novo projeto Python de duas maneiras:
pnpm nx g @aws/nx-plugin:py#projectyarn nx g @aws/nx-plugin:py#projectnpx nx g @aws/nx-plugin:py#projectbunx nx g @aws/nx-plugin:py#projectVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:py#project --dry-runyarn nx g @aws/nx-plugin:py#project --dry-runnpx nx g @aws/nx-plugin:py#project --dry-runbunx nx g @aws/nx-plugin:py#project --dry-run- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - py#project - Preencha os parâmetros obrigatórios
- Clique em
Generate
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| name Obrigatório | string | - | O nome do projeto Python |
| directory | string | packages | Diretório pai onde o projeto é colocado. |
| subDirectory | string | - | O subdiretório onde o projeto é colocado. Por padrão, este é o nome do projeto. |
| type Obrigatório | application | library | application | Se o projeto é uma aplicação ou biblioteca |
| moduleName | string | - | Nome do módulo Python |
| preferInstallDependencies | boolean | true | Se deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final. |
Saída do Gerador
Seção intitulada “Saída do Gerador”O gerador criará a seguinte estrutura de projeto no diretório <directory>/<name>:
Directory<module-name>
- __init__.py Module initialisation
Directorytests
- __init__.py Module initialisation
- conftest.py Test configuration
- test_noop.py Placeholder test
- project.json Project configuration and build targets
- pyproject.toml Packaging configuration file used by UV
- .python-version Contains the project’s Python version
Você também pode notar os seguintes arquivos criados/atualizados na raiz do seu workspace:
- pyproject.toml Workspace level packaging configuration for UV
- .python-version Contains the workspace Python version
- uv.lock Lockfile for Python dependencies
Escrevendo Código-Fonte Python
Seção intitulada “Escrevendo Código-Fonte Python”Adicione seu código-fonte Python no diretório <module-name>.
Importando o Código da sua Biblioteca em Outros Projetos
Seção intitulada “Importando o Código da sua Biblioteca em Outros Projetos”Use o target add para adicionar uma dependência a um projeto Python.
Suponha que criamos dois projetos python, my_app e my_lib. Estes terão nomes de projeto totalmente qualificados de my_scope.my_app e my_scope.my_lib, e por padrão cada um terá nomes de módulo de my_scope_my_app e my_scope_my_lib.
Para que my_app dependa de my_lib, podemos executar o seguinte comando:
pnpm nx run my_scope.my_app:add my_scope.my_libyarn nx run my_scope.my_app:add my_scope.my_libnpx nx run my_scope.my_app:add my_scope.my_libbunx nx run my_scope.my_app:add my_scope.my_libVocê pode então importar o código da sua biblioteca:
from my_scope_my_lib.my_module import my_functionAcima, my_scope_my_lib é o nome do módulo para a lib, my_module corresponde a um arquivo-fonte Python my_module.py, e my_function é um método definido nesse arquivo.
Dependências
Seção intitulada “Dependências”Para adicionar dependências ao seu projeto, você pode executar o target add no seu projeto Python, por exemplo:
pnpm nx run my_scope.my_library:add some-pip-packageyarn nx run my_scope.my_library:add some-pip-packagenpx nx run my_scope.my_library:add some-pip-packagebunx nx run my_scope.my_library:add some-pip-packageIsso adicionará a dependência ao arquivo pyproject.toml do seu projeto e atualizará o uv.lock raiz.
Código de Runtime
Seção intitulada “Código de Runtime”Quando você usa seu projeto Python como código de runtime (por exemplo, como o handler para uma função AWS lambda), você precisará criar um bundle do código-fonte e todas as suas dependências. Você pode conseguir isso adicionando um target como o seguinte ao seu arquivo 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"] }, },}Construção
Seção intitulada “Construção”Seu projeto Python está configurado com um target build (definido em project.json), que você pode executar via:
pnpm nx build <project-name>yarn nx build <project-name>npx nx build <project-name>bunx nx build <project-name>Onde <project-name> é o nome totalmente qualificado do seu projeto.
O target build irá compilar, fazer lint, testar e verificar tipos do seu projeto.
A saída da construção pode ser encontrada na pasta dist raiz no seu workspace, dentro de um diretório para seu pacote e target, por exemplo dist/packages/<my-library>/build
Para construir todos os projetos no seu workspace, execute:
pnpm nx run-many --target buildyarn nx run-many --target buildnpx nx run-many --target buildbunx nx run-many --target buildOu use o comando abreviado:
pnpm buildyarn buildnpm run buildbun buildpytest está configurado para testar seu projeto.
Escrevendo Testes
Seção intitulada “Escrevendo Testes”Os testes devem ser escritos no diretório test dentro do seu projeto, em arquivos python prefixados com test_, por exemplo:
Directorymy_library
- my_module.py
Directorytests
- test_my_module.py Tests for my_module.py
Testes são métodos que começam com test_ e fazem asserções para verificar expectativas, por exemplo:
from my_library.my_module import say_hello
def test_say_hello(): assert say_hello("Darth Vader") == "Hello, Darth Vader!"Para mais detalhes sobre como escrever testes, consulte a documentação do pytest.
Executando Testes
Seção intitulada “Executando Testes”Os testes serão executados como parte do target build para seu projeto, mas você também pode executá-los separadamente executando o target test:
pnpm nx test <project-name>yarn nx test <project-name>npx nx test <project-name>bunx nx test <project-name>Você pode executar um teste individual ou conjunto de testes usando a flag -k, especificando o nome do arquivo de teste ou método:
pnpm nx test <project-name> -k 'test_say_hello'yarn nx test <project-name> -k 'test_say_hello'npx nx test <project-name> -k 'test_say_hello'bunx nx test <project-name> -k 'test_say_hello'Verificação de Tipos
Seção intitulada “Verificação de Tipos”Projetos Python usam ty para verificação de tipos.
Executando o Verificador de Tipos
Seção intitulada “Executando o Verificador de Tipos”A verificação de tipos é executada como parte do target build para seu projeto, mas você também pode executá-la separadamente via o target typecheck:
pnpm nx run <project-name>:typecheckyarn nx run <project-name>:typechecknpx nx run <project-name>:typecheckbunx nx run <project-name>:typecheckSuprimindo Erros de Tipo
Seção intitulada “Suprimindo Erros de Tipo”Para suprimir um diagnóstico específico para uma única linha, adicione um comentário # ty: ignore[<rule>] no final da linha, por exemplo:
value: int = "not an int" # ty: ignore[invalid-assignment]Para configurar o comportamento da verificação de tipos em todo o seu projeto, adicione uma seção [tool.ty] ao pyproject.toml do seu projeto. Consulte a referência de configuração do ty para opções disponíveis.
Linting
Seção intitulada “Linting”Projetos Python usam Ruff para linting.
Executando o Linter
Seção intitulada “Executando o Linter”Para invocar o linter para verificar seu projeto, você pode executar o target lint.
pnpm nx lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>Corrigindo Problemas de Lint
Seção intitulada “Corrigindo Problemas de Lint”A maioria dos problemas de linting ou formatação pode ser corrigida automaticamente. Você pode dizer ao Ruff para corrigir problemas de lint executando com o argumento --configuration=fix.
pnpm nx lint <project-name> --configuration=fixyarn nx lint <project-name> --configuration=fixnpx nx lint <project-name> --configuration=fixbunx nx lint <project-name> --configuration=fixDa mesma forma, se você quiser corrigir todos os problemas de lint em todos os pacotes no seu workspace, você pode executar:
pnpm nx run-many --target lint --all --configuration=fixyarn nx run-many --target lint --all --configuration=fixnpx nx run-many --target lint --all --configuration=fixbunx nx run-many --target lint --all --configuration=fixIgnorando Problemas de Lint
Seção intitulada “Ignorando Problemas de Lint”Para evitar que problemas de linting te atrasem durante o desenvolvimento (particularmente se você tiver problemas não auto-corrigíveis no seu projeto), você pode executar uma construção com a configuração skip-lint:
pnpm nx run-many --target build --configuration=skip-lintyarn nx run-many --target build --configuration=skip-lintnpx nx run-many --target build --configuration=skip-lintbunx nx run-many --target build --configuration=skip-lintIsso ainda executará o Ruff como parte da construção, mas o target lint sempre será considerado bem-sucedido.