Pular para o conteúdo

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.

Você pode gerar um novo projeto Python de duas maneiras:

Terminal window
pnpm nx g @aws/nx-plugin:py#project
Você também pode realizar uma execução simulada para ver quais arquivos seriam alterados
Terminal window
pnpm nx g @aws/nx-plugin:py#project --dry-run
ParâmetroTipoPadrãoDescrição
name Obrigatóriostring-O nome do projeto Python
directory stringpackagesDiretó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órioapplication | libraryapplicationSe o projeto é uma aplicação ou biblioteca
moduleName string-Nome do módulo Python
preferInstallDependencies booleantrueSe 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.

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

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:

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

Você pode então importar o código da sua biblioteca:

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

Acima, 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.

Para adicionar dependências ao seu projeto, você pode executar o target add no seu projeto Python, por exemplo:

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

Isso adicionará a dependência ao arquivo pyproject.toml do seu projeto e atualizará o uv.lock raiz.

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:

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"]
},
},
}

Seu projeto Python está configurado com um target build (definido em project.json), que você pode executar via:

Terminal window
pnpm 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:

Terminal window
pnpm nx run-many --target build

Ou use o comando abreviado:

Terminal window
pnpm build

pytest está configurado para testar seu projeto.

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:

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!"

Para mais detalhes sobre como escrever testes, consulte a documentação do pytest.

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:

Terminal window
pnpm 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:

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

Projetos Python usam ty para verificação 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:

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

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.

Projetos Python usam Ruff para linting.

Para invocar o linter para verificar seu projeto, você pode executar o target lint.

Terminal window
pnpm nx lint <project-name>

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.

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

Da mesma forma, se você quiser corrigir todos os problemas de lint em todos os pacotes no seu workspace, você pode executar:

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

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:

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

Isso ainda executará o Ruff como parte da construção, mas o target lint sempre será considerado bem-sucedido.