@heyai-rules/pilo-masterkit 1.2.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/agents/architect.md +211 -211
- package/.agent/agents/build-error-resolver.md +114 -114
- package/.agent/agents/chief-of-staff.md +151 -151
- package/.agent/agents/code-reviewer.md +237 -237
- package/.agent/agents/cpp-build-resolver.md +90 -90
- package/.agent/agents/cpp-reviewer.md +72 -72
- package/.agent/agents/csharp-reviewer.md +101 -0
- package/.agent/agents/dart-build-resolver.md +201 -0
- package/.agent/agents/database-reviewer.md +91 -91
- package/.agent/agents/doc-updater.md +107 -107
- package/.agent/agents/docs-lookup.md +68 -68
- package/.agent/agents/e2e-runner.md +107 -107
- package/.agent/agents/flutter-reviewer.md +243 -243
- package/.agent/agents/gan-evaluator.md +209 -0
- package/.agent/agents/gan-generator.md +131 -0
- package/.agent/agents/gan-planner.md +99 -0
- package/.agent/agents/go-build-resolver.md +94 -94
- package/.agent/agents/go-reviewer.md +76 -76
- package/.agent/agents/harness-optimizer.md +35 -35
- package/.agent/agents/healthcare-reviewer.md +83 -0
- package/.agent/agents/java-build-resolver.md +153 -153
- package/.agent/agents/java-reviewer.md +92 -92
- package/.agent/agents/kotlin-build-resolver.md +118 -118
- package/.agent/agents/kotlin-reviewer.md +159 -159
- package/.agent/agents/loop-operator.md +36 -36
- package/.agent/agents/opensource-forker.md +198 -0
- package/.agent/agents/opensource-packager.md +249 -0
- package/.agent/agents/opensource-sanitizer.md +188 -0
- package/.agent/agents/performance-optimizer.md +392 -133
- package/.agent/agents/personas/athena-agent/agent.json +10 -0
- package/.agent/agents/personas/athena-agent/athena-backend-logic-architecture-profile.md +189 -0
- package/.agent/agents/personas/athena-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/athena-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/athena-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/athena-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/athena-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/athena-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/da-vinci-agent/agent.json +10 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/da-vinci-agent/da-vinci-frontend-ui-ux-design-profile.md +189 -0
- package/.agent/agents/personas/da-vinci-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/da-vinci-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/duong-tang-agent/agent.json +10 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/duong-tang-agent/tang-monk-quality-testing-documentation-profile.md +189 -0
- package/.agent/agents/personas/duong-tang-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/duong-tang-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/gia-cat-luong-agent/agent.json +10 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/gia-cat-luong-agent/kongming-research-strategy-analysis-profile.md +189 -0
- package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/mihata-agent/agent.json +10 -0
- package/.agent/agents/personas/mihata-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/mihata-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/mihata-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/mihata-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/mihata-agent/mihata-multi-agent-orchestration-profile.md +189 -0
- package/.agent/agents/personas/mihata-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/mihata-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/tesla-agent/agent.json +10 -0
- package/.agent/agents/personas/tesla-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/tesla-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/tesla-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/tesla-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/tesla-agent/tesla-fullstack-system-optimization-profile.md +189 -0
- package/.agent/agents/personas/tesla-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/tesla-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/tu-ma-y-agent/agent.json +10 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/tu-ma-y-agent/simayi-feasibility-risk-control-profile.md +189 -0
- package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/venti-agent/agent.json +10 -0
- package/.agent/agents/personas/venti-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/venti-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/venti-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/venti-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/venti-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/venti-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/venti-agent/venti-learning-communication-mentoring-profile.md +189 -0
- package/.agent/agents/planner.md +212 -212
- package/.agent/agents/python-reviewer.md +98 -98
- package/.agent/agents/pytorch-build-resolver.md +120 -120
- package/.agent/agents/refactor-cleaner.md +85 -85
- package/.agent/agents/rust-build-resolver.md +148 -148
- package/.agent/agents/rust-reviewer.md +94 -94
- package/.agent/agents/security-reviewer.md +108 -108
- package/.agent/agents/tdd-guide.md +91 -91
- package/.agent/agents/typescript-reviewer.md +112 -112
- package/.agent/contexts/dev.md +20 -0
- package/.agent/contexts/research.md +26 -0
- package/.agent/contexts/review.md +22 -0
- package/.agent/hooks/hooks.json +395 -0
- package/.agent/hooks/readme.md +222 -0
- package/.agent/mcp-configs/mcp-servers.json +181 -0
- package/.agent/rules/common/agents.md +50 -0
- package/.agent/rules/common/code-review.md +124 -0
- package/.agent/rules/common/coding-style.md +48 -0
- package/.agent/rules/common/development-workflow.md +44 -0
- package/.agent/rules/common/git-workflow.md +24 -0
- package/.agent/rules/common/hooks.md +30 -0
- package/.agent/rules/common/patterns.md +31 -0
- package/.agent/rules/common/performance.md +55 -0
- package/.agent/rules/common/security.md +29 -0
- package/.agent/rules/common/testing.md +29 -0
- package/.agent/rules/cpp/coding-style.md +44 -0
- package/.agent/rules/cpp/hooks.md +39 -0
- package/.agent/rules/cpp/patterns.md +51 -0
- package/.agent/rules/cpp/security.md +51 -0
- package/.agent/rules/cpp/testing.md +44 -0
- package/.agent/rules/csharp/coding-style.md +72 -0
- package/.agent/rules/csharp/hooks.md +25 -0
- package/.agent/rules/csharp/patterns.md +50 -0
- package/.agent/rules/csharp/security.md +58 -0
- package/.agent/rules/csharp/testing.md +46 -0
- package/.agent/rules/dart/coding-style.md +159 -0
- package/.agent/rules/dart/hooks.md +66 -0
- package/.agent/rules/dart/patterns.md +261 -0
- package/.agent/rules/dart/security.md +135 -0
- package/.agent/rules/dart/testing.md +215 -0
- package/.agent/rules/golang/coding-style.md +32 -0
- package/.agent/rules/golang/hooks.md +17 -0
- package/.agent/rules/golang/patterns.md +45 -0
- package/.agent/rules/golang/security.md +34 -0
- package/.agent/rules/golang/testing.md +31 -0
- package/.agent/rules/java/coding-style.md +114 -0
- package/.agent/rules/java/hooks.md +18 -0
- package/.agent/rules/java/patterns.md +146 -0
- package/.agent/rules/java/security.md +100 -0
- package/.agent/rules/java/testing.md +131 -0
- package/.agent/rules/kotlin/coding-style.md +86 -0
- package/.agent/rules/kotlin/hooks.md +17 -0
- package/.agent/rules/kotlin/patterns.md +146 -0
- package/.agent/rules/kotlin/security.md +82 -0
- package/.agent/rules/kotlin/testing.md +128 -0
- package/.agent/rules/perl/coding-style.md +46 -0
- package/.agent/rules/perl/hooks.md +22 -0
- package/.agent/rules/perl/patterns.md +76 -0
- package/.agent/rules/perl/security.md +69 -0
- package/.agent/rules/perl/testing.md +54 -0
- package/.agent/rules/php/coding-style.md +40 -0
- package/.agent/rules/php/hooks.md +24 -0
- package/.agent/rules/php/patterns.md +33 -0
- package/.agent/rules/php/security.md +37 -0
- package/.agent/rules/php/testing.md +39 -0
- package/.agent/rules/python/coding-style.md +42 -0
- package/.agent/rules/python/hooks.md +19 -0
- package/.agent/rules/python/patterns.md +39 -0
- package/.agent/rules/python/security.md +30 -0
- package/.agent/rules/python/testing.md +38 -0
- package/.agent/rules/readme.md +111 -0
- package/.agent/rules/rust/coding-style.md +151 -0
- package/.agent/rules/rust/hooks.md +16 -0
- package/.agent/rules/rust/patterns.md +168 -0
- package/.agent/rules/rust/security.md +141 -0
- package/.agent/rules/rust/testing.md +154 -0
- package/.agent/rules/swift/coding-style.md +47 -0
- package/.agent/rules/swift/hooks.md +20 -0
- package/.agent/rules/swift/patterns.md +66 -0
- package/.agent/rules/swift/security.md +33 -0
- package/.agent/rules/swift/testing.md +45 -0
- package/.agent/rules/typescript/coding-style.md +199 -0
- package/.agent/rules/typescript/hooks.md +22 -0
- package/.agent/rules/typescript/patterns.md +52 -0
- package/.agent/rules/typescript/security.md +28 -0
- package/.agent/rules/typescript/testing.md +18 -0
- package/.agent/rules/web/coding-style.md +96 -0
- package/.agent/rules/web/design-quality.md +63 -0
- package/.agent/rules/web/hooks.md +120 -0
- package/.agent/rules/web/patterns.md +79 -0
- package/.agent/rules/web/performance.md +64 -0
- package/.agent/rules/web/security.md +57 -0
- package/.agent/rules/web/testing.md +55 -0
- package/.agent/rules/zh/agents.md +50 -0
- package/.agent/rules/zh/code-review.md +124 -0
- package/.agent/rules/zh/coding-style.md +48 -0
- package/.agent/rules/zh/development-workflow.md +44 -0
- package/.agent/rules/zh/git-workflow.md +24 -0
- package/.agent/rules/zh/hooks.md +30 -0
- package/.agent/rules/zh/patterns.md +31 -0
- package/.agent/rules/zh/performance.md +55 -0
- package/.agent/rules/zh/readme.md +108 -0
- package/.agent/rules/zh/security.md +29 -0
- package/.agent/rules/zh/testing.md +29 -0
- package/.agent/skills/agent-eval/SKILL.md +145 -0
- package/.agent/skills/agent-harness-construction/SKILL.md +73 -0
- package/.agent/skills/agent-payment-x402/SKILL.md +178 -0
- package/.agent/skills/agentic-engineering/SKILL.md +63 -0
- package/.agent/skills/ai-first-engineering/SKILL.md +51 -0
- package/.agent/skills/ai-regression-testing/SKILL.md +385 -0
- package/.agent/skills/android-clean-architecture/SKILL.md +339 -0
- package/.agent/skills/api-design/SKILL.md +523 -0
- package/.agent/skills/architecture-decision-records/SKILL.md +179 -0
- package/.agent/skills/article-writing/SKILL.md +79 -0
- package/.agent/skills/autonomous-agent-harness/SKILL.md +267 -0
- package/.agent/skills/autonomous-loops/SKILL.md +610 -0
- package/.agent/skills/backend-patterns/SKILL.md +598 -0
- package/.agent/skills/benchmark/SKILL.md +93 -0
- package/.agent/skills/blueprint/SKILL.md +105 -0
- package/.agent/skills/brand-voice/SKILL.md +97 -0
- package/.agent/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/.agent/skills/browser-qa/SKILL.md +87 -0
- package/.agent/skills/bun-runtime/SKILL.md +84 -0
- package/.agent/skills/canary-watch/SKILL.md +99 -0
- package/.agent/skills/carrier-relationship-management/SKILL.md +212 -0
- package/.agent/skills/ck/SKILL.md +147 -0
- package/.agent/skills/ck/commands/forget.mjs +44 -0
- package/.agent/skills/ck/commands/info.mjs +24 -0
- package/.agent/skills/ck/commands/init.mjs +143 -0
- package/.agent/skills/ck/commands/list.mjs +40 -0
- package/.agent/skills/ck/commands/migrate.mjs +202 -0
- package/.agent/skills/ck/commands/resume.mjs +36 -0
- package/.agent/skills/ck/commands/save.mjs +210 -0
- package/.agent/skills/ck/commands/shared.mjs +387 -0
- package/.agent/skills/ck/hooks/session-start.mjs +224 -0
- package/.agent/skills/claude-api/SKILL.md +337 -0
- package/.agent/skills/claude-devfleet/SKILL.md +103 -0
- package/.agent/skills/click-path-audit/SKILL.md +244 -0
- package/.agent/skills/clickhouse-io/SKILL.md +439 -0
- package/.agent/skills/codebase-onboarding/SKILL.md +233 -0
- package/.agent/skills/coding-standards/SKILL.md +530 -0
- package/.agent/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/.agent/skills/configure-ecc/SKILL.md +367 -0
- package/.agent/skills/connections-optimizer/SKILL.md +189 -0
- package/.agent/skills/content-engine/SKILL.md +131 -0
- package/.agent/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/.agent/skills/context-budget/SKILL.md +135 -0
- package/.agent/skills/continuous-agent-loop/SKILL.md +45 -0
- package/.agent/skills/continuous-learning/SKILL.md +119 -0
- package/.agent/skills/continuous-learning/config.json +18 -0
- package/.agent/skills/continuous-learning/evaluate-session.sh +69 -0
- package/.agent/skills/continuous-learning-v2/SKILL.md +365 -0
- package/.agent/skills/continuous-learning-v2/agents/observer-loop.sh +271 -0
- package/.agent/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/.agent/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/.agent/skills/continuous-learning-v2/agents/start-observer.sh +244 -0
- package/.agent/skills/continuous-learning-v2/config.json +8 -0
- package/.agent/skills/continuous-learning-v2/hooks/observe.sh +428 -0
- package/.agent/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
- package/.agent/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
- package/.agent/skills/continuous-learning-v2/scripts/test-parse-instinct.py +984 -0
- package/.agent/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/.agent/skills/cpp-coding-standards/SKILL.md +723 -0
- package/.agent/skills/cpp-testing/SKILL.md +324 -0
- package/.agent/skills/crosspost/SKILL.md +111 -0
- package/.agent/skills/csharp-testing/SKILL.md +321 -0
- package/.agent/skills/customer-billing-ops/SKILL.md +140 -0
- package/.agent/skills/customs-trade-compliance/SKILL.md +263 -0
- package/.agent/skills/dart-flutter-patterns/SKILL.md +563 -0
- package/.agent/skills/data-scraper-agent/SKILL.md +764 -0
- package/.agent/skills/database-migrations/SKILL.md +429 -0
- package/.agent/skills/deep-research/SKILL.md +155 -0
- package/.agent/skills/deployment-patterns/SKILL.md +427 -0
- package/.agent/skills/design-system/SKILL.md +82 -0
- package/.agent/skills/django-patterns/SKILL.md +734 -0
- package/.agent/skills/django-security/SKILL.md +593 -0
- package/.agent/skills/django-tdd/SKILL.md +729 -0
- package/.agent/skills/django-verification/SKILL.md +469 -0
- package/.agent/skills/dmux-workflows/SKILL.md +191 -0
- package/.agent/skills/docker-patterns/SKILL.md +364 -0
- package/.agent/skills/documentation-lookup/SKILL.md +90 -0
- package/.agent/skills/dotnet-patterns/SKILL.md +321 -0
- package/.agent/skills/e2e-testing/SKILL.md +326 -0
- package/.agent/skills/energy-procurement/SKILL.md +228 -0
- package/.agent/skills/enterprise-agent-ops/SKILL.md +50 -0
- package/.agent/skills/eval-harness/SKILL.md +270 -0
- package/.agent/skills/exa-search/SKILL.md +103 -0
- package/.agent/skills/fal-ai-media/SKILL.md +284 -0
- package/.agent/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/.agent/skills/foundation-models-on-device/SKILL.md +243 -0
- package/.agent/skills/frontend-patterns/SKILL.md +642 -0
- package/.agent/skills/frontend-slides/SKILL.md +184 -0
- package/.agent/skills/frontend-slides/style-presets.md +330 -0
- package/.agent/skills/gan-style-harness/SKILL.md +278 -0
- package/.agent/skills/git-workflow/SKILL.md +715 -0
- package/.agent/skills/golang-patterns/SKILL.md +674 -0
- package/.agent/skills/golang-testing/SKILL.md +720 -0
- package/.agent/skills/google-workspace-ops/SKILL.md +95 -0
- package/.agent/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/.agent/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/.agent/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/.agent/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/.agent/skills/hexagonal-architecture/SKILL.md +276 -0
- package/.agent/skills/inventory-demand-planning/SKILL.md +247 -0
- package/.agent/skills/investor-materials/SKILL.md +96 -0
- package/.agent/skills/investor-outreach/SKILL.md +91 -0
- package/.agent/skills/iterative-retrieval/SKILL.md +211 -0
- package/.agent/skills/java-coding-standards/SKILL.md +147 -0
- package/.agent/skills/jira-integration/SKILL.md +293 -0
- package/.agent/skills/jpa-patterns/SKILL.md +151 -0
- package/.agent/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/.agent/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/.agent/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/.agent/skills/kotlin-patterns/SKILL.md +711 -0
- package/.agent/skills/kotlin-testing/SKILL.md +824 -0
- package/.agent/skills/laravel-patterns/SKILL.md +415 -0
- package/.agent/skills/laravel-plugin-discovery/SKILL.md +229 -0
- package/.agent/skills/laravel-security/SKILL.md +285 -0
- package/.agent/skills/laravel-tdd/SKILL.md +283 -0
- package/.agent/skills/laravel-verification/SKILL.md +179 -0
- package/.agent/skills/lead-intelligence/SKILL.md +321 -0
- package/.agent/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/.agent/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/.agent/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/.agent/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/.agent/skills/liquid-glass-design/SKILL.md +279 -0
- package/.agent/skills/logistics-exception-management/SKILL.md +222 -0
- package/.agent/skills/manim-video/SKILL.md +89 -0
- package/.agent/skills/manim-video/assets/network-graph-scene.py +52 -0
- package/.agent/skills/market-research/SKILL.md +75 -0
- package/.agent/skills/mcp-builder/SKILL.md +173 -113
- package/.agent/skills/mcp-builder/license.txt +202 -0
- package/.agent/skills/mcp-builder/reference/evaluation.md +602 -0
- package/.agent/skills/mcp-builder/reference/mcp-best-practices.md +249 -0
- package/.agent/skills/mcp-builder/reference/node-mcp-server.md +970 -0
- package/.agent/skills/mcp-builder/reference/python-mcp-server.md +719 -0
- package/.agent/skills/mcp-builder/scripts/connections.py +151 -0
- package/.agent/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/.agent/skills/mcp-builder/scripts/example-evaluation.xml +22 -0
- package/.agent/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/.agent/skills/mcp-server-patterns/SKILL.md +67 -0
- package/.agent/skills/nanoclaw-repl/SKILL.md +33 -0
- package/.agent/skills/nestjs-patterns/SKILL.md +230 -0
- package/.agent/skills/nextjs-turbopack/SKILL.md +44 -0
- package/.agent/skills/nutrient-document-processing/SKILL.md +167 -0
- package/.agent/skills/nuxt4-patterns/SKILL.md +100 -0
- package/.agent/skills/openclaw-persona-forge/SKILL.md +296 -0
- package/.agent/skills/openclaw-persona-forge/gacha.py +224 -0
- package/.agent/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/.agent/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/.agent/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/.agent/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/.agent/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/.agent/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/.agent/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/.agent/skills/opensource-pipeline/SKILL.md +255 -0
- package/.agent/skills/perl-patterns/SKILL.md +504 -0
- package/.agent/skills/perl-security/SKILL.md +503 -0
- package/.agent/skills/perl-testing/SKILL.md +475 -0
- package/.agent/skills/plankton-code-quality/SKILL.md +236 -0
- package/.agent/skills/postgres-patterns/SKILL.md +147 -0
- package/.agent/skills/product-lens/SKILL.md +85 -0
- package/.agent/skills/production-scheduling/SKILL.md +238 -0
- package/.agent/skills/project-flow-ops/SKILL.md +111 -0
- package/.agent/skills/project-guidelines-example/SKILL.md +349 -0
- package/.agent/skills/prompt-optimizer/SKILL.md +397 -0
- package/.agent/skills/python-patterns/SKILL.md +622 -313
- package/.agent/skills/python-testing/SKILL.md +816 -0
- package/.agent/skills/pytorch-patterns/SKILL.md +396 -0
- package/.agent/skills/quality-nonconformance/SKILL.md +260 -0
- package/.agent/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
- package/.agent/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
- package/.agent/skills/remotion-video-creation/SKILL.md +43 -0
- package/.agent/skills/remotion-video-creation/rules/3d.md +86 -0
- package/.agent/skills/remotion-video-creation/rules/animations.md +29 -0
- package/.agent/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/.agent/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/.agent/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/.agent/skills/remotion-video-creation/rules/assets.md +78 -0
- package/.agent/skills/remotion-video-creation/rules/audio.md +172 -0
- package/.agent/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/.agent/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/.agent/skills/remotion-video-creation/rules/charts.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/.agent/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/.agent/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/.agent/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/.agent/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/.agent/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/.agent/skills/remotion-video-creation/rules/images.md +130 -0
- package/.agent/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/.agent/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/.agent/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/.agent/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/.agent/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/.agent/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/.agent/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/.agent/skills/remotion-video-creation/rules/timing.md +179 -0
- package/.agent/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/.agent/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/.agent/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/.agent/skills/remotion-video-creation/rules/videos.md +171 -0
- package/.agent/skills/repo-scan/SKILL.md +78 -0
- package/.agent/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/.agent/skills/rules-distill/SKILL.md +264 -0
- package/.agent/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/.agent/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/.agent/skills/rust-patterns/SKILL.md +499 -0
- package/.agent/skills/rust-testing/SKILL.md +500 -0
- package/.agent/skills/safety-guard/SKILL.md +75 -0
- package/.agent/skills/santa-method/SKILL.md +306 -0
- package/.agent/skills/search-first/SKILL.md +161 -0
- package/.agent/skills/security-review/SKILL.md +495 -0
- package/.agent/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/.agent/skills/security-scan/SKILL.md +165 -0
- package/.agent/skills/skill-comply/SKILL.md +58 -0
- package/.agent/skills/skill-comply/fixtures/compliant-trace.jsonl +5 -0
- package/.agent/skills/skill-comply/fixtures/noncompliant-trace.jsonl +3 -0
- package/.agent/skills/skill-comply/fixtures/tdd-spec.yaml +44 -0
- package/.agent/skills/skill-comply/prompts/classifier.md +24 -0
- package/.agent/skills/skill-comply/prompts/scenario-generator.md +62 -0
- package/.agent/skills/skill-comply/prompts/spec-generator.md +42 -0
- package/.agent/skills/skill-comply/pyproject.toml +15 -0
- package/.agent/skills/skill-comply/scripts/classifier.py +85 -0
- package/.agent/skills/skill-comply/scripts/grader.py +122 -0
- package/.agent/skills/skill-comply/scripts/init.py +0 -0
- package/.agent/skills/skill-comply/scripts/parser.py +107 -0
- package/.agent/skills/skill-comply/scripts/report.py +170 -0
- package/.agent/skills/skill-comply/scripts/run.py +127 -0
- package/.agent/skills/skill-comply/scripts/runner.py +161 -0
- package/.agent/skills/skill-comply/scripts/scenario-generator.py +70 -0
- package/.agent/skills/skill-comply/scripts/spec-generator.py +72 -0
- package/.agent/skills/skill-comply/scripts/utils.py +13 -0
- package/.agent/skills/skill-comply/tests/test-grader.py +137 -0
- package/.agent/skills/skill-comply/tests/test-parser.py +90 -0
- package/.agent/skills/skill-creator/SKILL.md +485 -0
- package/.agent/skills/skill-creator/agents/analyzer.md +274 -0
- package/.agent/skills/skill-creator/agents/comparator.md +202 -0
- package/.agent/skills/skill-creator/agents/grader.md +223 -0
- package/.agent/skills/skill-creator/assets/eval-review.html +146 -0
- package/.agent/skills/skill-creator/eval-viewer/generate-review.py +471 -0
- package/.agent/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.agent/skills/skill-creator/license.txt +202 -0
- package/.agent/skills/skill-creator/references/schemas.md +430 -0
- package/.agent/skills/skill-creator/scripts/aggregate-benchmark.py +401 -0
- package/.agent/skills/skill-creator/scripts/generate-report.py +326 -0
- package/.agent/skills/skill-creator/scripts/improve-description.py +247 -0
- package/.agent/skills/skill-creator/scripts/init.py +0 -0
- package/.agent/skills/skill-creator/scripts/package-skill.py +136 -0
- package/.agent/skills/skill-creator/scripts/quick-validate.py +103 -0
- package/.agent/skills/skill-creator/scripts/run-eval.py +310 -0
- package/.agent/skills/skill-creator/scripts/run-loop.py +328 -0
- package/.agent/skills/skill-creator/scripts/utils.py +47 -0
- package/.agent/skills/skill-stocktake/SKILL.md +193 -0
- package/.agent/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/.agent/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/.agent/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/.agent/skills/social-graph-ranker/SKILL.md +154 -0
- package/.agent/skills/springboot-patterns/SKILL.md +314 -0
- package/.agent/skills/springboot-security/SKILL.md +272 -0
- package/.agent/skills/springboot-tdd/SKILL.md +158 -0
- package/.agent/skills/springboot-verification/SKILL.md +231 -0
- package/.agent/skills/strategic-compact/SKILL.md +131 -0
- package/.agent/skills/strategic-compact/suggest-compact.sh +54 -0
- package/.agent/skills/swift-actor-persistence/SKILL.md +143 -0
- package/.agent/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/.agent/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/.agent/skills/swiftui-patterns/SKILL.md +259 -0
- package/.agent/skills/tdd-workflow/SKILL.md +412 -98
- package/.agent/skills/team-builder/SKILL.md +168 -0
- package/.agent/skills/token-budget-advisor/SKILL.md +133 -0
- package/.agent/skills/ui-demo/SKILL.md +465 -0
- package/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/.agent/skills/ui-ux-pro-max/data/landing.csv +28 -28
- package/.agent/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/.agent/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/.agent/skills/ui-ux-pro-max/scripts/search.py +114 -114
- package/.agent/skills/verification-loop/SKILL.md +126 -0
- package/.agent/skills/video-editing/SKILL.md +310 -0
- package/.agent/skills/videodb/SKILL.md +374 -0
- package/.agent/skills/videodb/reference/api-reference.md +550 -0
- package/.agent/skills/videodb/reference/capture-reference.md +407 -0
- package/.agent/skills/videodb/reference/capture.md +101 -0
- package/.agent/skills/videodb/reference/editor.md +443 -0
- package/.agent/skills/videodb/reference/generative.md +331 -0
- package/.agent/skills/videodb/reference/rtstream-reference.md +564 -0
- package/.agent/skills/videodb/reference/rtstream.md +65 -0
- package/.agent/skills/videodb/reference/search.md +230 -0
- package/.agent/skills/videodb/reference/streaming.md +406 -0
- package/.agent/skills/videodb/reference/use-cases.md +118 -0
- package/.agent/skills/videodb/scripts/ws-listener.py +282 -0
- package/.agent/skills/visa-doc-translate/SKILL.md +117 -0
- package/.agent/skills/visa-doc-translate/readme.md +86 -0
- package/.agent/skills/workspace-surface-audit/SKILL.md +125 -0
- package/.agent/skills/x-api/SKILL.md +230 -0
- package/.agent/tasks/two-track-merge-contract.md +29 -0
- package/.agent/workflows/aside.md +164 -164
- package/.agent/workflows/build-fix.md +62 -62
- package/.agent/workflows/checkpoint.md +74 -74
- package/.agent/workflows/claw.md +23 -51
- package/.agent/workflows/clean-memory.md +34 -0
- package/.agent/workflows/code-review.md +289 -40
- package/.agent/workflows/context-budget.md +23 -29
- package/.agent/workflows/cpp-build.md +173 -173
- package/.agent/workflows/cpp-review.md +132 -132
- package/.agent/workflows/cpp-test.md +251 -251
- package/.agent/workflows/devfleet.md +23 -92
- package/.agent/workflows/docs.md +23 -31
- package/.agent/workflows/e2e.md +268 -365
- package/.agent/workflows/eval.md +23 -120
- package/.agent/workflows/evolve.md +178 -178
- package/.agent/workflows/flutter-build.md +164 -0
- package/.agent/workflows/flutter-review.md +116 -0
- package/.agent/workflows/flutter-test.md +144 -0
- package/.agent/workflows/gan-build.md +99 -0
- package/.agent/workflows/gan-design.md +35 -0
- package/.agent/workflows/go-build.md +183 -183
- package/.agent/workflows/go-review.md +148 -148
- package/.agent/workflows/go-test.md +268 -268
- package/.agent/workflows/gradle-build.md +70 -70
- package/.agent/workflows/harness-audit.md +73 -71
- package/.agent/workflows/instinct-export.md +66 -66
- package/.agent/workflows/instinct-import.md +114 -114
- package/.agent/workflows/instinct-status.md +59 -59
- package/.agent/workflows/jira.md +106 -0
- package/.agent/workflows/kotlin-build.md +174 -174
- package/.agent/workflows/kotlin-review.md +140 -140
- package/.agent/workflows/kotlin-test.md +312 -312
- package/.agent/workflows/learn-eval.md +116 -116
- package/.agent/workflows/learn.md +70 -70
- package/.agent/workflows/loop-start.md +32 -32
- package/.agent/workflows/loop-status.md +24 -24
- package/.agent/workflows/model-route.md +26 -26
- package/.agent/workflows/multi-backend.md +158 -158
- package/.agent/workflows/multi-execute.md +315 -315
- package/.agent/workflows/multi-frontend.md +158 -158
- package/.agent/workflows/multi-plan.md +268 -268
- package/.agent/workflows/multi-workflow.md +191 -191
- package/.agent/workflows/orchestrate.md +135 -231
- package/.agent/workflows/plan.md +117 -115
- package/.agent/workflows/pm2.md +272 -272
- package/.agent/workflows/projects.md +39 -39
- package/.agent/workflows/promote.md +41 -41
- package/.agent/workflows/prompt-optimize.md +23 -38
- package/.agent/workflows/prp-commit.md +112 -0
- package/.agent/workflows/prp-implement.md +385 -0
- package/.agent/workflows/prp-plan.md +502 -0
- package/.agent/workflows/prp-pr.md +184 -0
- package/.agent/workflows/prp-prd.md +447 -0
- package/.agent/workflows/prune.md +31 -31
- package/.agent/workflows/python-review.md +297 -297
- package/.agent/workflows/quality-gate.md +29 -29
- package/.agent/workflows/refactor-clean.md +80 -80
- package/.agent/workflows/resume-session.md +156 -156
- package/.agent/workflows/rules-distill.md +20 -11
- package/.agent/workflows/rust-build.md +187 -187
- package/.agent/workflows/rust-review.md +142 -142
- package/.agent/workflows/rust-test.md +308 -308
- package/.agent/workflows/santa-loop.md +175 -0
- package/.agent/workflows/save-session.md +275 -275
- package/.agent/workflows/sessions.md +333 -333
- package/.agent/workflows/setup-pm.md +80 -80
- package/.agent/workflows/skill-create.md +174 -174
- package/.agent/workflows/skill-health.md +54 -54
- package/.agent/workflows/tdd.md +231 -328
- package/.agent/workflows/test-coverage.md +69 -69
- package/.agent/workflows/update-codemaps.md +72 -72
- package/.agent/workflows/update-docs.md +84 -84
- package/.agent/workflows/verify.md +23 -59
- package/LICENSE +176 -176
- package/README.md +28 -20
- package/RELEASE.md +32 -36
- package/package.json +87 -79
- package/scripts/release-check.js +55 -55
- package/src/bin/cli.js +399 -53
- package/src/lib/installer.js +360 -114
- package/src/lib/manifests/stacks.js +122 -0
- package/src/lib/slash-commands.js +28 -0
- package/src/templates/claude/CLAUDE.en.md +42 -0
- package/src/templates/claude/CLAUDE.md +42 -0
- package/src/templates/claude/CLAUDE.vi.md +42 -0
- package/src/templates/codex/AGENTS.en.md +40 -0
- package/src/templates/codex/AGENTS.md +40 -0
- package/src/templates/codex/AGENTS.vi.md +40 -0
- package/src/templates/cursor/pilo-masterkit.mdc +20 -0
- package/src/templates/gemini/GEMINI.en.md +56 -0
- package/src/templates/gemini/GEMINI.md +56 -0
- package/src/templates/gemini/GEMINI.vi.md +56 -0
- package/src/templates/github/copilot-instructions.md +16 -0
|
@@ -1,441 +1,750 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: python-patterns
|
|
3
|
-
description:
|
|
4
|
-
|
|
3
|
+
description: Pythonic idioms, PEP 8 standards, type hints, and best practices for building robust, efficient, and maintainable Python applications.
|
|
4
|
+
origin: ECC
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# Python Patterns
|
|
7
|
+
# Python Development Patterns
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
> **Learn to THINK, not memorize patterns.**
|
|
9
|
+
Idiomatic Python patterns and best practices for building robust, efficient, and maintainable applications.
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
## When to Activate
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
- Writing new Python code
|
|
14
|
+
- Reviewing Python code
|
|
15
|
+
- Refactoring existing Python code
|
|
16
|
+
- Designing Python packages/modules
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
## Core Principles
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
- Choose async vs sync based on CONTEXT
|
|
20
|
-
- Don't default to same framework every time
|
|
20
|
+
### 1. Readability Counts
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Python prioritizes readability. Code should be obvious and easy to understand.
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
What are you building?
|
|
30
|
-
│
|
|
31
|
-
├── API-first / Microservices
|
|
32
|
-
│ └── FastAPI (async, modern, fast)
|
|
33
|
-
│
|
|
34
|
-
├── Full-stack web / CMS / Admin
|
|
35
|
-
│ └── Django (batteries-included)
|
|
36
|
-
│
|
|
37
|
-
├── Simple / Script / Learning
|
|
38
|
-
│ └── Flask (minimal, flexible)
|
|
39
|
-
│
|
|
40
|
-
├── AI/ML API serving
|
|
41
|
-
│ └── FastAPI (Pydantic, async, uvicorn)
|
|
42
|
-
│
|
|
43
|
-
└── Background workers
|
|
44
|
-
└── Celery + any framework
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Comparison Principles
|
|
48
|
-
|
|
49
|
-
| Factor | FastAPI | Django | Flask |
|
|
50
|
-
|--------|---------|--------|-------|
|
|
51
|
-
| **Best for** | APIs, microservices | Full-stack, CMS | Simple, learning |
|
|
52
|
-
| **Async** | Native | Django 5.0+ | Via extensions |
|
|
53
|
-
| **Admin** | Manual | Built-in | Via extensions |
|
|
54
|
-
| **ORM** | Choose your own | Django ORM | Choose your own |
|
|
55
|
-
| **Learning curve** | Low | Medium | Low |
|
|
56
|
-
|
|
57
|
-
### Selection Questions to Ask:
|
|
58
|
-
1. Is this API-only or full-stack?
|
|
59
|
-
2. Need admin interface?
|
|
60
|
-
3. Team familiar with async?
|
|
61
|
-
4. Existing infrastructure?
|
|
24
|
+
```python
|
|
25
|
+
# Good: Clear and readable
|
|
26
|
+
def get_active_users(users: list[User]) -> list[User]:
|
|
27
|
+
"""Return only active users from the provided list."""
|
|
28
|
+
return [user for user in users if user.is_active]
|
|
62
29
|
|
|
63
|
-
---
|
|
64
30
|
|
|
65
|
-
|
|
31
|
+
# Bad: Clever but confusing
|
|
32
|
+
def get_active_users(u):
|
|
33
|
+
return [x for x in u if x.a]
|
|
34
|
+
```
|
|
66
35
|
|
|
67
|
-
###
|
|
36
|
+
### 2. Explicit is Better Than Implicit
|
|
68
37
|
|
|
69
|
-
|
|
70
|
-
async def is better when:
|
|
71
|
-
├── I/O-bound operations (database, HTTP, file)
|
|
72
|
-
├── Many concurrent connections
|
|
73
|
-
├── Real-time features
|
|
74
|
-
├── Microservices communication
|
|
75
|
-
└── FastAPI/Starlette/Django ASGI
|
|
38
|
+
Avoid magic; be clear about what your code does.
|
|
76
39
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
├── Legacy codebase
|
|
81
|
-
├── Team unfamiliar with async
|
|
82
|
-
└── Blocking libraries (no async version)
|
|
83
|
-
```
|
|
40
|
+
```python
|
|
41
|
+
# Good: Explicit configuration
|
|
42
|
+
import logging
|
|
84
43
|
|
|
85
|
-
|
|
44
|
+
logging.basicConfig(
|
|
45
|
+
level=logging.INFO,
|
|
46
|
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
47
|
+
)
|
|
86
48
|
|
|
49
|
+
# Bad: Hidden side effects
|
|
50
|
+
import some_module
|
|
51
|
+
some_module.setup() # What does this do?
|
|
87
52
|
```
|
|
88
|
-
I/O-bound → async (waiting for external)
|
|
89
|
-
CPU-bound → sync + multiprocessing (computing)
|
|
90
53
|
|
|
91
|
-
|
|
92
|
-
├── Mix sync and async carelessly
|
|
93
|
-
├── Use sync libraries in async code
|
|
94
|
-
└── Force async for CPU work
|
|
95
|
-
```
|
|
54
|
+
### 3. EAFP - Easier to Ask Forgiveness Than Permission
|
|
96
55
|
|
|
97
|
-
|
|
56
|
+
Python prefers exception handling over checking conditions.
|
|
98
57
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
58
|
+
```python
|
|
59
|
+
# Good: EAFP style
|
|
60
|
+
def get_value(dictionary: dict, key: str) -> Any:
|
|
61
|
+
try:
|
|
62
|
+
return dictionary[key]
|
|
63
|
+
except KeyError:
|
|
64
|
+
return default_value
|
|
106
65
|
|
|
107
|
-
|
|
66
|
+
# Bad: LBYL (Look Before You Leap) style
|
|
67
|
+
def get_value(dictionary: dict, key: str) -> Any:
|
|
68
|
+
if key in dictionary:
|
|
69
|
+
return dictionary[key]
|
|
70
|
+
else:
|
|
71
|
+
return default_value
|
|
72
|
+
```
|
|
108
73
|
|
|
109
|
-
##
|
|
74
|
+
## Type Hints
|
|
110
75
|
|
|
111
|
-
###
|
|
76
|
+
### Basic Type Annotations
|
|
112
77
|
|
|
78
|
+
```python
|
|
79
|
+
from typing import Optional, List, Dict, Any
|
|
80
|
+
|
|
81
|
+
def process_user(
|
|
82
|
+
user_id: str,
|
|
83
|
+
data: Dict[str, Any],
|
|
84
|
+
active: bool = True
|
|
85
|
+
) -> Optional[User]:
|
|
86
|
+
"""Process a user and return the updated User or None."""
|
|
87
|
+
if not active:
|
|
88
|
+
return None
|
|
89
|
+
return User(user_id, data)
|
|
113
90
|
```
|
|
114
|
-
Always type:
|
|
115
|
-
├── Function parameters
|
|
116
|
-
├── Return types
|
|
117
|
-
├── Class attributes
|
|
118
|
-
├── Public APIs
|
|
119
91
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
92
|
+
### Modern Type Hints (Python 3.9+)
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
# Python 3.9+ - Use built-in types
|
|
96
|
+
def process_items(items: list[str]) -> dict[str, int]:
|
|
97
|
+
return {item: len(item) for item in items}
|
|
98
|
+
|
|
99
|
+
# Python 3.8 and earlier - Use typing module
|
|
100
|
+
from typing import List, Dict
|
|
101
|
+
|
|
102
|
+
def process_items(items: List[str]) -> Dict[str, int]:
|
|
103
|
+
return {item: len(item) for item in items}
|
|
124
104
|
```
|
|
125
105
|
|
|
126
|
-
###
|
|
106
|
+
### Type Aliases and TypeVar
|
|
127
107
|
|
|
128
108
|
```python
|
|
129
|
-
|
|
109
|
+
from typing import TypeVar, Union
|
|
130
110
|
|
|
131
|
-
#
|
|
132
|
-
|
|
133
|
-
def find_user(id: int) -> Optional[User]: ...
|
|
111
|
+
# Type alias for complex types
|
|
112
|
+
JSON = Union[dict[str, Any], list[Any], str, int, float, bool, None]
|
|
134
113
|
|
|
135
|
-
|
|
136
|
-
|
|
114
|
+
def parse_json(data: str) -> JSON:
|
|
115
|
+
return json.loads(data)
|
|
137
116
|
|
|
138
|
-
# Generic
|
|
139
|
-
|
|
140
|
-
def get_mapping() -> dict[str, int]: ...
|
|
117
|
+
# Generic types
|
|
118
|
+
T = TypeVar('T')
|
|
141
119
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
120
|
+
def first(items: list[T]) -> T | None:
|
|
121
|
+
"""Return the first item or None if list is empty."""
|
|
122
|
+
return items[0] if items else None
|
|
145
123
|
```
|
|
146
124
|
|
|
147
|
-
###
|
|
125
|
+
### Protocol-Based Duck Typing
|
|
148
126
|
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
├── API request/response models
|
|
152
|
-
├── Configuration/settings
|
|
153
|
-
├── Data validation
|
|
154
|
-
├── Serialization
|
|
127
|
+
```python
|
|
128
|
+
from typing import Protocol
|
|
155
129
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
130
|
+
class Renderable(Protocol):
|
|
131
|
+
def render(self) -> str:
|
|
132
|
+
"""Render the object to a string."""
|
|
133
|
+
|
|
134
|
+
def render_all(items: list[Renderable]) -> str:
|
|
135
|
+
"""Render all items that implement the Renderable protocol."""
|
|
136
|
+
return "\n".join(item.render() for item in items)
|
|
161
137
|
```
|
|
162
138
|
|
|
163
|
-
|
|
139
|
+
## Error Handling Patterns
|
|
164
140
|
|
|
165
|
-
|
|
141
|
+
### Specific Exception Handling
|
|
166
142
|
|
|
167
|
-
|
|
143
|
+
```python
|
|
144
|
+
# Good: Catch specific exceptions
|
|
145
|
+
def load_config(path: str) -> Config:
|
|
146
|
+
try:
|
|
147
|
+
with open(path) as f:
|
|
148
|
+
return Config.from_json(f.read())
|
|
149
|
+
except FileNotFoundError as e:
|
|
150
|
+
raise ConfigError(f"Config file not found: {path}") from e
|
|
151
|
+
except json.JSONDecodeError as e:
|
|
152
|
+
raise ConfigError(f"Invalid JSON in config: {path}") from e
|
|
153
|
+
|
|
154
|
+
# Bad: Bare except
|
|
155
|
+
def load_config(path: str) -> Config:
|
|
156
|
+
try:
|
|
157
|
+
with open(path) as f:
|
|
158
|
+
return Config.from_json(f.read())
|
|
159
|
+
except:
|
|
160
|
+
return None # Silent failure!
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Exception Chaining
|
|
168
164
|
|
|
165
|
+
```python
|
|
166
|
+
def process_data(data: str) -> Result:
|
|
167
|
+
try:
|
|
168
|
+
parsed = json.loads(data)
|
|
169
|
+
except json.JSONDecodeError as e:
|
|
170
|
+
# Chain exceptions to preserve the traceback
|
|
171
|
+
raise ValueError(f"Failed to parse data: {data}") from e
|
|
169
172
|
```
|
|
170
|
-
Small project / Script:
|
|
171
|
-
├── main.py
|
|
172
|
-
├── utils.py
|
|
173
|
-
└── requirements.txt
|
|
174
173
|
|
|
175
|
-
|
|
176
|
-
├── app/
|
|
177
|
-
│ ├── __init__.py
|
|
178
|
-
│ ├── main.py
|
|
179
|
-
│ ├── models/
|
|
180
|
-
│ ├── routes/
|
|
181
|
-
│ ├── services/
|
|
182
|
-
│ └── schemas/
|
|
183
|
-
├── tests/
|
|
184
|
-
└── pyproject.toml
|
|
174
|
+
### Custom Exception Hierarchy
|
|
185
175
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
176
|
+
```python
|
|
177
|
+
class AppError(Exception):
|
|
178
|
+
"""Base exception for all application errors."""
|
|
179
|
+
pass
|
|
180
|
+
|
|
181
|
+
class ValidationError(AppError):
|
|
182
|
+
"""Raised when input validation fails."""
|
|
183
|
+
pass
|
|
184
|
+
|
|
185
|
+
class NotFoundError(AppError):
|
|
186
|
+
"""Raised when a requested resource is not found."""
|
|
187
|
+
pass
|
|
188
|
+
|
|
189
|
+
# Usage
|
|
190
|
+
def get_user(user_id: str) -> User:
|
|
191
|
+
user = db.find_user(user_id)
|
|
192
|
+
if not user:
|
|
193
|
+
raise NotFoundError(f"User not found: {user_id}")
|
|
194
|
+
return user
|
|
196
195
|
```
|
|
197
196
|
|
|
198
|
-
|
|
197
|
+
## Context Managers
|
|
198
|
+
|
|
199
|
+
### Resource Management
|
|
199
200
|
|
|
201
|
+
```python
|
|
202
|
+
# Good: Using context managers
|
|
203
|
+
def process_file(path: str) -> str:
|
|
204
|
+
with open(path, 'r') as f:
|
|
205
|
+
return f.read()
|
|
206
|
+
|
|
207
|
+
# Bad: Manual resource management
|
|
208
|
+
def process_file(path: str) -> str:
|
|
209
|
+
f = open(path, 'r')
|
|
210
|
+
try:
|
|
211
|
+
return f.read()
|
|
212
|
+
finally:
|
|
213
|
+
f.close()
|
|
200
214
|
```
|
|
201
|
-
Organize by feature or layer:
|
|
202
215
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
├── schemas/ (Pydantic models)
|
|
208
|
-
└── dependencies/ (shared deps)
|
|
216
|
+
### Custom Context Managers
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
from contextlib import contextmanager
|
|
209
220
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
221
|
+
@contextmanager
|
|
222
|
+
def timer(name: str):
|
|
223
|
+
"""Context manager to time a block of code."""
|
|
224
|
+
start = time.perf_counter()
|
|
225
|
+
yield
|
|
226
|
+
elapsed = time.perf_counter() - start
|
|
227
|
+
print(f"{name} took {elapsed:.4f} seconds")
|
|
228
|
+
|
|
229
|
+
# Usage
|
|
230
|
+
with timer("data processing"):
|
|
231
|
+
process_large_dataset()
|
|
217
232
|
```
|
|
218
233
|
|
|
219
|
-
|
|
234
|
+
### Context Manager Classes
|
|
235
|
+
|
|
236
|
+
```python
|
|
237
|
+
class DatabaseTransaction:
|
|
238
|
+
def __init__(self, connection):
|
|
239
|
+
self.connection = connection
|
|
220
240
|
|
|
221
|
-
|
|
241
|
+
def __enter__(self):
|
|
242
|
+
self.connection.begin_transaction()
|
|
243
|
+
return self
|
|
222
244
|
|
|
223
|
-
|
|
245
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
246
|
+
if exc_type is None:
|
|
247
|
+
self.connection.commit()
|
|
248
|
+
else:
|
|
249
|
+
self.connection.rollback()
|
|
250
|
+
return False # Don't suppress exceptions
|
|
224
251
|
|
|
252
|
+
# Usage
|
|
253
|
+
with DatabaseTransaction(conn):
|
|
254
|
+
user = conn.create_user(user_data)
|
|
255
|
+
conn.create_profile(user.id, profile_data)
|
|
225
256
|
```
|
|
226
|
-
Django supports async:
|
|
227
|
-
├── Async views
|
|
228
|
-
├── Async middleware
|
|
229
|
-
├── Async ORM (limited)
|
|
230
|
-
└── ASGI deployment
|
|
231
257
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
258
|
+
## Comprehensions and Generators
|
|
259
|
+
|
|
260
|
+
### List Comprehensions
|
|
261
|
+
|
|
262
|
+
```python
|
|
263
|
+
# Good: List comprehension for simple transformations
|
|
264
|
+
names = [user.name for user in users if user.is_active]
|
|
265
|
+
|
|
266
|
+
# Bad: Manual loop
|
|
267
|
+
names = []
|
|
268
|
+
for user in users:
|
|
269
|
+
if user.is_active:
|
|
270
|
+
names.append(user.name)
|
|
271
|
+
|
|
272
|
+
# Complex comprehensions should be expanded
|
|
273
|
+
# Bad: Too complex
|
|
274
|
+
result = [x * 2 for x in items if x > 0 if x % 2 == 0]
|
|
275
|
+
|
|
276
|
+
# Good: Use a generator function
|
|
277
|
+
def filter_and_transform(items: Iterable[int]) -> list[int]:
|
|
278
|
+
result = []
|
|
279
|
+
for x in items:
|
|
280
|
+
if x > 0 and x % 2 == 0:
|
|
281
|
+
result.append(x * 2)
|
|
282
|
+
return result
|
|
237
283
|
```
|
|
238
284
|
|
|
239
|
-
###
|
|
285
|
+
### Generator Expressions
|
|
286
|
+
|
|
287
|
+
```python
|
|
288
|
+
# Good: Generator for lazy evaluation
|
|
289
|
+
total = sum(x * x for x in range(1_000_000))
|
|
240
290
|
|
|
291
|
+
# Bad: Creates large intermediate list
|
|
292
|
+
total = sum([x * x for x in range(1_000_000)])
|
|
241
293
|
```
|
|
242
|
-
Model design:
|
|
243
|
-
├── Fat models, thin views
|
|
244
|
-
├── Use managers for common queries
|
|
245
|
-
├── Abstract base classes for shared fields
|
|
246
294
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
295
|
+
### Generator Functions
|
|
296
|
+
|
|
297
|
+
```python
|
|
298
|
+
def read_large_file(path: str) -> Iterator[str]:
|
|
299
|
+
"""Read a large file line by line."""
|
|
300
|
+
with open(path) as f:
|
|
301
|
+
for line in f:
|
|
302
|
+
yield line.strip()
|
|
251
303
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
├── Avoid N+1 queries
|
|
256
|
-
└── Use .only() for specific fields
|
|
304
|
+
# Usage
|
|
305
|
+
for line in read_large_file("huge.txt"):
|
|
306
|
+
process(line)
|
|
257
307
|
```
|
|
258
308
|
|
|
259
|
-
|
|
309
|
+
## Data Classes and Named Tuples
|
|
260
310
|
|
|
261
|
-
|
|
311
|
+
### Data Classes
|
|
262
312
|
|
|
263
|
-
|
|
313
|
+
```python
|
|
314
|
+
from dataclasses import dataclass, field
|
|
315
|
+
from datetime import datetime
|
|
264
316
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
317
|
+
@dataclass
|
|
318
|
+
class User:
|
|
319
|
+
"""User entity with automatic __init__, __repr__, and __eq__."""
|
|
320
|
+
id: str
|
|
321
|
+
name: str
|
|
322
|
+
email: str
|
|
323
|
+
created_at: datetime = field(default_factory=datetime.now)
|
|
324
|
+
is_active: bool = True
|
|
271
325
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
326
|
+
# Usage
|
|
327
|
+
user = User(
|
|
328
|
+
id="123",
|
|
329
|
+
name="Alice",
|
|
330
|
+
email="alice@example.com"
|
|
331
|
+
)
|
|
277
332
|
```
|
|
278
333
|
|
|
279
|
-
###
|
|
334
|
+
### Data Classes with Validation
|
|
280
335
|
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
├── Shared resources
|
|
336
|
+
```python
|
|
337
|
+
@dataclass
|
|
338
|
+
class User:
|
|
339
|
+
email: str
|
|
340
|
+
age: int
|
|
287
341
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
342
|
+
def __post_init__(self):
|
|
343
|
+
# Validate email format
|
|
344
|
+
if "@" not in self.email:
|
|
345
|
+
raise ValueError(f"Invalid email: {self.email}")
|
|
346
|
+
# Validate age range
|
|
347
|
+
if self.age < 0 or self.age > 150:
|
|
348
|
+
raise ValueError(f"Invalid age: {self.age}")
|
|
292
349
|
```
|
|
293
350
|
|
|
294
|
-
###
|
|
351
|
+
### Named Tuples
|
|
295
352
|
|
|
296
353
|
```python
|
|
297
|
-
|
|
354
|
+
from typing import NamedTuple
|
|
298
355
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
...
|
|
356
|
+
class Point(NamedTuple):
|
|
357
|
+
"""Immutable 2D point."""
|
|
358
|
+
x: float
|
|
359
|
+
y: float
|
|
304
360
|
|
|
305
|
-
|
|
306
|
-
|
|
361
|
+
def distance(self, other: 'Point') -> float:
|
|
362
|
+
return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
|
|
363
|
+
|
|
364
|
+
# Usage
|
|
365
|
+
p1 = Point(0, 0)
|
|
366
|
+
p2 = Point(3, 4)
|
|
367
|
+
print(p1.distance(p2)) # 5.0
|
|
307
368
|
```
|
|
308
369
|
|
|
309
|
-
|
|
370
|
+
## Decorators
|
|
310
371
|
|
|
311
|
-
|
|
372
|
+
### Function Decorators
|
|
312
373
|
|
|
313
|
-
|
|
374
|
+
```python
|
|
375
|
+
import functools
|
|
376
|
+
import time
|
|
314
377
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
378
|
+
def timer(func: Callable) -> Callable:
|
|
379
|
+
"""Decorator to time function execution."""
|
|
380
|
+
@functools.wraps(func)
|
|
381
|
+
def wrapper(*args, **kwargs):
|
|
382
|
+
start = time.perf_counter()
|
|
383
|
+
result = func(*args, **kwargs)
|
|
384
|
+
elapsed = time.perf_counter() - start
|
|
385
|
+
print(f"{func.__name__} took {elapsed:.4f}s")
|
|
386
|
+
return result
|
|
387
|
+
return wrapper
|
|
322
388
|
|
|
323
|
-
|
|
389
|
+
@timer
|
|
390
|
+
def slow_function():
|
|
391
|
+
time.sleep(1)
|
|
324
392
|
|
|
393
|
+
# slow_function() prints: slow_function took 1.0012s
|
|
325
394
|
```
|
|
326
|
-
FastAPI BackgroundTasks:
|
|
327
|
-
├── Quick operations
|
|
328
|
-
├── No persistence needed
|
|
329
|
-
├── Fire-and-forget
|
|
330
|
-
└── Same process
|
|
331
395
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
396
|
+
### Parameterized Decorators
|
|
397
|
+
|
|
398
|
+
```python
|
|
399
|
+
def repeat(times: int):
|
|
400
|
+
"""Decorator to repeat a function multiple times."""
|
|
401
|
+
def decorator(func: Callable) -> Callable:
|
|
402
|
+
@functools.wraps(func)
|
|
403
|
+
def wrapper(*args, **kwargs):
|
|
404
|
+
results = []
|
|
405
|
+
for _ in range(times):
|
|
406
|
+
results.append(func(*args, **kwargs))
|
|
407
|
+
return results
|
|
408
|
+
return wrapper
|
|
409
|
+
return decorator
|
|
410
|
+
|
|
411
|
+
@repeat(times=3)
|
|
412
|
+
def greet(name: str) -> str:
|
|
413
|
+
return f"Hello, {name}!"
|
|
414
|
+
|
|
415
|
+
# greet("Alice") returns ["Hello, Alice!", "Hello, Alice!", "Hello, Alice!"]
|
|
338
416
|
```
|
|
339
417
|
|
|
340
|
-
|
|
418
|
+
### Class-Based Decorators
|
|
419
|
+
|
|
420
|
+
```python
|
|
421
|
+
class CountCalls:
|
|
422
|
+
"""Decorator that counts how many times a function is called."""
|
|
423
|
+
def __init__(self, func: Callable):
|
|
424
|
+
functools.update_wrapper(self, func)
|
|
425
|
+
self.func = func
|
|
426
|
+
self.count = 0
|
|
427
|
+
|
|
428
|
+
def __call__(self, *args, **kwargs):
|
|
429
|
+
self.count += 1
|
|
430
|
+
print(f"{self.func.__name__} has been called {self.count} times")
|
|
431
|
+
return self.func(*args, **kwargs)
|
|
341
432
|
|
|
342
|
-
|
|
433
|
+
@CountCalls
|
|
434
|
+
def process():
|
|
435
|
+
pass
|
|
343
436
|
|
|
344
|
-
|
|
437
|
+
# Each call to process() prints the call count
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## Concurrency Patterns
|
|
441
|
+
|
|
442
|
+
### Threading for I/O-Bound Tasks
|
|
443
|
+
|
|
444
|
+
```python
|
|
445
|
+
import concurrent.futures
|
|
446
|
+
import threading
|
|
447
|
+
|
|
448
|
+
def fetch_url(url: str) -> str:
|
|
449
|
+
"""Fetch a URL (I/O-bound operation)."""
|
|
450
|
+
import urllib.request
|
|
451
|
+
with urllib.request.urlopen(url) as response:
|
|
452
|
+
return response.read().decode()
|
|
453
|
+
|
|
454
|
+
def fetch_all_urls(urls: list[str]) -> dict[str, str]:
|
|
455
|
+
"""Fetch multiple URLs concurrently using threads."""
|
|
456
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
|
|
457
|
+
future_to_url = {executor.submit(fetch_url, url): url for url in urls}
|
|
458
|
+
results = {}
|
|
459
|
+
for future in concurrent.futures.as_completed(future_to_url):
|
|
460
|
+
url = future_to_url[future]
|
|
461
|
+
try:
|
|
462
|
+
results[url] = future.result()
|
|
463
|
+
except Exception as e:
|
|
464
|
+
results[url] = f"Error: {e}"
|
|
465
|
+
return results
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Multiprocessing for CPU-Bound Tasks
|
|
469
|
+
|
|
470
|
+
```python
|
|
471
|
+
def process_data(data: list[int]) -> int:
|
|
472
|
+
"""CPU-intensive computation."""
|
|
473
|
+
return sum(x ** 2 for x in data)
|
|
345
474
|
|
|
475
|
+
def process_all(datasets: list[list[int]]) -> list[int]:
|
|
476
|
+
"""Process multiple datasets using multiple processes."""
|
|
477
|
+
with concurrent.futures.ProcessPoolExecutor() as executor:
|
|
478
|
+
results = list(executor.map(process_data, datasets))
|
|
479
|
+
return results
|
|
346
480
|
```
|
|
347
|
-
In FastAPI:
|
|
348
|
-
├── Create custom exception classes
|
|
349
|
-
├── Register exception handlers
|
|
350
|
-
├── Return consistent error format
|
|
351
|
-
└── Log without exposing internals
|
|
352
481
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
482
|
+
### Async/Await for Concurrent I/O
|
|
483
|
+
|
|
484
|
+
```python
|
|
485
|
+
import asyncio
|
|
486
|
+
|
|
487
|
+
async def fetch_async(url: str) -> str:
|
|
488
|
+
"""Fetch a URL asynchronously."""
|
|
489
|
+
import aiohttp
|
|
490
|
+
async with aiohttp.ClientSession() as session:
|
|
491
|
+
async with session.get(url) as response:
|
|
492
|
+
return await response.text()
|
|
493
|
+
|
|
494
|
+
async def fetch_all(urls: list[str]) -> dict[str, str]:
|
|
495
|
+
"""Fetch multiple URLs concurrently."""
|
|
496
|
+
tasks = [fetch_async(url) for url in urls]
|
|
497
|
+
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
498
|
+
return dict(zip(urls, results))
|
|
357
499
|
```
|
|
358
500
|
|
|
359
|
-
|
|
501
|
+
## Package Organization
|
|
502
|
+
|
|
503
|
+
### Standard Project Layout
|
|
360
504
|
|
|
361
505
|
```
|
|
362
|
-
|
|
363
|
-
├──
|
|
364
|
-
|
|
365
|
-
├──
|
|
366
|
-
|
|
506
|
+
myproject/
|
|
507
|
+
├── src/
|
|
508
|
+
│ └── mypackage/
|
|
509
|
+
│ ├── __init__.py
|
|
510
|
+
│ ├── main.py
|
|
511
|
+
│ ├── api/
|
|
512
|
+
│ │ ├── __init__.py
|
|
513
|
+
│ │ └── routes.py
|
|
514
|
+
│ ├── models/
|
|
515
|
+
│ │ ├── __init__.py
|
|
516
|
+
│ │ └── user.py
|
|
517
|
+
│ └── utils/
|
|
518
|
+
│ ├── __init__.py
|
|
519
|
+
│ └── helpers.py
|
|
520
|
+
├── tests/
|
|
521
|
+
│ ├── __init__.py
|
|
522
|
+
│ ├── conftest.py
|
|
523
|
+
│ ├── test_api.py
|
|
524
|
+
│ └── test_models.py
|
|
525
|
+
├── pyproject.toml
|
|
526
|
+
├── README.md
|
|
527
|
+
└── .gitignore
|
|
367
528
|
```
|
|
368
529
|
|
|
369
|
-
|
|
530
|
+
### Import Conventions
|
|
531
|
+
|
|
532
|
+
```python
|
|
533
|
+
# Good: Import order - stdlib, third-party, local
|
|
534
|
+
import os
|
|
535
|
+
import sys
|
|
536
|
+
from pathlib import Path
|
|
537
|
+
|
|
538
|
+
import requests
|
|
539
|
+
from fastapi import FastAPI
|
|
540
|
+
|
|
541
|
+
from mypackage.models import User
|
|
542
|
+
from mypackage.utils import format_name
|
|
370
543
|
|
|
371
|
-
|
|
544
|
+
# Good: Use isort for automatic import sorting
|
|
545
|
+
# pip install isort
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
### __init__.py for Package Exports
|
|
549
|
+
|
|
550
|
+
```python
|
|
551
|
+
# mypackage/__init__.py
|
|
552
|
+
"""mypackage - A sample Python package."""
|
|
372
553
|
|
|
373
|
-
|
|
554
|
+
__version__ = "1.0.0"
|
|
374
555
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
| **Integration** | API endpoints | pytest + httpx/TestClient |
|
|
379
|
-
| **E2E** | Full workflows | pytest + DB |
|
|
556
|
+
# Export main classes/functions at package level
|
|
557
|
+
from mypackage.models import User, Post
|
|
558
|
+
from mypackage.utils import format_name
|
|
380
559
|
|
|
381
|
-
|
|
560
|
+
__all__ = ["User", "Post", "format_name"]
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
## Memory and Performance
|
|
564
|
+
|
|
565
|
+
### Using __slots__ for Memory Efficiency
|
|
382
566
|
|
|
383
567
|
```python
|
|
384
|
-
#
|
|
568
|
+
# Bad: Regular class uses __dict__ (more memory)
|
|
569
|
+
class Point:
|
|
570
|
+
def __init__(self, x: float, y: float):
|
|
571
|
+
self.x = x
|
|
572
|
+
self.y = y
|
|
385
573
|
|
|
386
|
-
|
|
387
|
-
|
|
574
|
+
# Good: __slots__ reduces memory usage
|
|
575
|
+
class Point:
|
|
576
|
+
__slots__ = ['x', 'y']
|
|
388
577
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
response = await client.get("/users")
|
|
393
|
-
assert response.status_code == 200
|
|
578
|
+
def __init__(self, x: float, y: float):
|
|
579
|
+
self.x = x
|
|
580
|
+
self.y = y
|
|
394
581
|
```
|
|
395
582
|
|
|
396
|
-
###
|
|
583
|
+
### Generator for Large Data
|
|
584
|
+
|
|
585
|
+
```python
|
|
586
|
+
# Bad: Returns full list in memory
|
|
587
|
+
def read_lines(path: str) -> list[str]:
|
|
588
|
+
with open(path) as f:
|
|
589
|
+
return [line.strip() for line in f]
|
|
590
|
+
|
|
591
|
+
# Good: Yields lines one at a time
|
|
592
|
+
def read_lines(path: str) -> Iterator[str]:
|
|
593
|
+
with open(path) as f:
|
|
594
|
+
for line in f:
|
|
595
|
+
yield line.strip()
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
### Avoid String Concatenation in Loops
|
|
599
|
+
|
|
600
|
+
```python
|
|
601
|
+
# Bad: O(n²) due to string immutability
|
|
602
|
+
result = ""
|
|
603
|
+
for item in items:
|
|
604
|
+
result += str(item)
|
|
605
|
+
|
|
606
|
+
# Good: O(n) using join
|
|
607
|
+
result = "".join(str(item) for item in items)
|
|
397
608
|
|
|
609
|
+
# Good: Using StringIO for building
|
|
610
|
+
from io import StringIO
|
|
611
|
+
|
|
612
|
+
buffer = StringIO()
|
|
613
|
+
for item in items:
|
|
614
|
+
buffer.write(str(item))
|
|
615
|
+
result = buffer.getvalue()
|
|
398
616
|
```
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
617
|
+
|
|
618
|
+
## Python Tooling Integration
|
|
619
|
+
|
|
620
|
+
### Essential Commands
|
|
621
|
+
|
|
622
|
+
```bash
|
|
623
|
+
# Code formatting
|
|
624
|
+
black .
|
|
625
|
+
isort .
|
|
626
|
+
|
|
627
|
+
# Linting
|
|
628
|
+
ruff check .
|
|
629
|
+
pylint mypackage/
|
|
630
|
+
|
|
631
|
+
# Type checking
|
|
632
|
+
mypy .
|
|
633
|
+
|
|
634
|
+
# Testing
|
|
635
|
+
pytest --cov=mypackage --cov-report=html
|
|
636
|
+
|
|
637
|
+
# Security scanning
|
|
638
|
+
bandit -r .
|
|
639
|
+
|
|
640
|
+
# Dependency management
|
|
641
|
+
pip-audit
|
|
642
|
+
safety check
|
|
404
643
|
```
|
|
405
644
|
|
|
406
|
-
|
|
645
|
+
### pyproject.toml Configuration
|
|
407
646
|
|
|
408
|
-
|
|
647
|
+
```toml
|
|
648
|
+
[project]
|
|
649
|
+
name = "mypackage"
|
|
650
|
+
version = "1.0.0"
|
|
651
|
+
requires-python = ">=3.9"
|
|
652
|
+
dependencies = [
|
|
653
|
+
"requests>=2.31.0",
|
|
654
|
+
"pydantic>=2.0.0",
|
|
655
|
+
]
|
|
409
656
|
|
|
410
|
-
|
|
657
|
+
[project.optional-dependencies]
|
|
658
|
+
dev = [
|
|
659
|
+
"pytest>=7.4.0",
|
|
660
|
+
"pytest-cov>=4.1.0",
|
|
661
|
+
"black>=23.0.0",
|
|
662
|
+
"ruff>=0.1.0",
|
|
663
|
+
"mypy>=1.5.0",
|
|
664
|
+
]
|
|
411
665
|
|
|
412
|
-
|
|
413
|
-
-
|
|
414
|
-
- [
|
|
415
|
-
- [ ] **Planned type hint strategy?**
|
|
416
|
-
- [ ] **Defined project structure?**
|
|
417
|
-
- [ ] **Planned error handling?**
|
|
418
|
-
- [ ] **Considered background tasks?**
|
|
666
|
+
[tool.black]
|
|
667
|
+
line-length = 88
|
|
668
|
+
target-version = ['py39']
|
|
419
669
|
|
|
420
|
-
|
|
670
|
+
[tool.ruff]
|
|
671
|
+
line-length = 88
|
|
672
|
+
select = ["E", "F", "I", "N", "W"]
|
|
421
673
|
|
|
422
|
-
|
|
674
|
+
[tool.mypy]
|
|
675
|
+
python_version = "3.9"
|
|
676
|
+
warn_return_any = true
|
|
677
|
+
warn_unused_configs = true
|
|
678
|
+
disallow_untyped_defs = true
|
|
423
679
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
- Put business logic in routes/views
|
|
429
|
-
- Ignore N+1 queries
|
|
430
|
-
- Mix async and sync carelessly
|
|
680
|
+
[tool.pytest.ini_options]
|
|
681
|
+
testpaths = ["tests"]
|
|
682
|
+
addopts = "--cov=mypackage --cov-report=term-missing"
|
|
683
|
+
```
|
|
431
684
|
|
|
432
|
-
|
|
433
|
-
- Choose framework based on context
|
|
434
|
-
- Ask about async requirements
|
|
435
|
-
- Use Pydantic for validation
|
|
436
|
-
- Separate concerns (routes → services → repos)
|
|
437
|
-
- Test critical paths
|
|
685
|
+
## Quick Reference: Python Idioms
|
|
438
686
|
|
|
439
|
-
|
|
687
|
+
| Idiom | Description |
|
|
688
|
+
|-------|-------------|
|
|
689
|
+
| EAFP | Easier to Ask Forgiveness than Permission |
|
|
690
|
+
| Context managers | Use `with` for resource management |
|
|
691
|
+
| List comprehensions | For simple transformations |
|
|
692
|
+
| Generators | For lazy evaluation and large datasets |
|
|
693
|
+
| Type hints | Annotate function signatures |
|
|
694
|
+
| Dataclasses | For data containers with auto-generated methods |
|
|
695
|
+
| `__slots__` | For memory optimization |
|
|
696
|
+
| f-strings | For string formatting (Python 3.6+) |
|
|
697
|
+
| `pathlib.Path` | For path operations (Python 3.4+) |
|
|
698
|
+
| `enumerate` | For index-element pairs in loops |
|
|
699
|
+
|
|
700
|
+
## Anti-Patterns to Avoid
|
|
440
701
|
|
|
441
|
-
|
|
702
|
+
```python
|
|
703
|
+
# Bad: Mutable default arguments
|
|
704
|
+
def append_to(item, items=[]):
|
|
705
|
+
items.append(item)
|
|
706
|
+
return items
|
|
707
|
+
|
|
708
|
+
# Good: Use None and create new list
|
|
709
|
+
def append_to(item, items=None):
|
|
710
|
+
if items is None:
|
|
711
|
+
items = []
|
|
712
|
+
items.append(item)
|
|
713
|
+
return items
|
|
714
|
+
|
|
715
|
+
# Bad: Checking type with type()
|
|
716
|
+
if type(obj) == list:
|
|
717
|
+
process(obj)
|
|
718
|
+
|
|
719
|
+
# Good: Use isinstance
|
|
720
|
+
if isinstance(obj, list):
|
|
721
|
+
process(obj)
|
|
722
|
+
|
|
723
|
+
# Bad: Comparing to None with ==
|
|
724
|
+
if value == None:
|
|
725
|
+
process()
|
|
726
|
+
|
|
727
|
+
# Good: Use is
|
|
728
|
+
if value is None:
|
|
729
|
+
process()
|
|
730
|
+
|
|
731
|
+
# Bad: from module import *
|
|
732
|
+
from os.path import *
|
|
733
|
+
|
|
734
|
+
# Good: Explicit imports
|
|
735
|
+
from os.path import join, exists
|
|
736
|
+
|
|
737
|
+
# Bad: Bare except
|
|
738
|
+
try:
|
|
739
|
+
risky_operation()
|
|
740
|
+
except:
|
|
741
|
+
pass
|
|
742
|
+
|
|
743
|
+
# Good: Specific exception
|
|
744
|
+
try:
|
|
745
|
+
risky_operation()
|
|
746
|
+
except SpecificError as e:
|
|
747
|
+
logger.error(f"Operation failed: {e}")
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
__Remember__: Python code should be readable, explicit, and follow the principle of least surprise. When in doubt, prioritize clarity over cleverness.
|