@umacloud/knowledge 1.0.1
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/00-governance/governance-capabilities.md +557 -0
- package/00-governance/knowledge-map.md +39 -0
- package/00-governance/maintenance-policy.md +76 -0
- package/00-governance/review-checklist.md +81 -0
- package/README.md +13 -0
- package/ai/01-standards/agent-development-complete.md +691 -0
- package/ai/01-standards/llm-application-complete.md +488 -0
- package/ai/01-standards/mlops-complete.md +798 -0
- package/ai/01-standards/prompt-engineering-complete.md +646 -0
- package/ai/01-standards/rag-architecture-complete.md +649 -0
- package/ai/02-playbooks/llm-evaluation-playbook.md +847 -0
- package/ai/03-checklists/ai-project-checklist.md +215 -0
- package/ai/04-antipatterns/ai-antipatterns.md +661 -0
- package/ai/05-cases/case-rag-production.md +147 -0
- package/ai/06-glossary/ai-glossary.md +162 -0
- package/ai/agent-evaluation-benchmark.md +53 -0
- package/ai/ai-agent-memory-context-management.md +41 -0
- package/ai/ai-cost-capacity-optimization-playbook.md +42 -0
- package/ai/ai-data-security-and-compliance-playbook.md +37 -0
- package/ai/ai-domain-index-and-checklist.md +40 -0
- package/ai/ai-governance-maturity-model.md +50 -0
- package/ai/ai-model-selection-and-routing-strategy.md +47 -0
- package/ai/ai-observability-and-oncall-runbook.md +52 -0
- package/ai/ai-rag-engineering-playbook.md +42 -0
- package/ai/ai-red-team-and-safety-evaluation.md +42 -0
- package/ai/ai-release-readiness-and-rollback-gate.md +42 -0
- package/ai/llm-agent-engineering-deep-dive.md +57 -0
- package/ai/prompt-and-tool-guardrails.md +52 -0
- package/api/01-standards/enterprise-api-standards.md +198 -0
- package/api/01-standards/rest-api-design-guide.md +63 -0
- package/api/02-playbooks/api-pagination-playbook.md +93 -0
- package/api/02-playbooks/graphql-production-playbook.md +176 -0
- package/api/03-checklists/api-review-checklist.md +55 -0
- package/api/04-antipatterns/api-antipatterns.md +112 -0
- package/architecture/01-standards/api-gateway-patterns.md +496 -0
- package/architecture/01-standards/cloud-native-patterns.md +644 -0
- package/architecture/01-standards/distributed-systems-patterns.md +591 -0
- package/architecture/01-standards/event-driven-architecture.md +595 -0
- package/architecture/01-standards/microservices-patterns-complete.md +968 -0
- package/architecture/01-standards/microservices-patterns.md +495 -0
- package/architecture/01-standards/system-design-interview.md +664 -0
- package/architecture/02-playbooks/microservices-patterns-playbook.md +137 -0
- package/architecture/02-playbooks/migration-playbook.md +780 -0
- package/architecture/02-playbooks/system-design-playbook.md +779 -0
- package/architecture/03-checklists/architecture-decision-checklist.md +297 -0
- package/architecture/04-antipatterns/architecture-antipatterns.md +417 -0
- package/architecture/05-cases/case-netflix-microservices.md +413 -0
- package/architecture/06-glossary/architecture-glossary.md +164 -0
- package/architecture/adr-template-and-examples.md +38 -0
- package/architecture/api-gateway-deep-dive.md +1291 -0
- package/architecture/configuration-management.md +1162 -0
- package/architecture/distributed-transactions.md +1220 -0
- package/architecture/microservices-complete.md +735 -0
- package/architecture/resilience-and-disaster-patterns.md +37 -0
- package/architecture/service-governance.md +1198 -0
- package/architecture/system-architecture-deep-dive.md +37 -0
- package/backend/01-standards/analytics-and-growth.md +65 -0
- package/backend/01-standards/api-and-error-conventions.md +120 -0
- package/backend/01-standards/application-layering-and-packaging.md +160 -0
- package/backend/01-standards/auth-implementation.md +104 -0
- package/backend/01-standards/backend-framework-idioms.md +74 -0
- package/backend/01-standards/background-jobs-and-async.md +66 -0
- package/backend/01-standards/caching-strategies-complete.md +390 -0
- package/backend/01-standards/config-and-observability.md +77 -0
- package/backend/01-standards/data-modeling-and-persistence.md +94 -0
- package/backend/01-standards/django-complete.md +1765 -0
- package/backend/01-standards/email-and-notifications.md +64 -0
- package/backend/01-standards/fastapi-complete.md +925 -0
- package/backend/01-standards/file-upload-and-storage.md +66 -0
- package/backend/01-standards/graphql-api-complete.md +416 -0
- package/backend/01-standards/llm-application-standard.md +78 -0
- package/backend/01-standards/message-queue-patterns.md +379 -0
- package/backend/01-standards/microservices-and-distributed.md +78 -0
- package/backend/01-standards/nestjs-complete.md +2167 -0
- package/backend/01-standards/payment-integration.md +80 -0
- package/backend/01-standards/rate-limiting-complete.md +451 -0
- package/backend/01-standards/realtime-and-websocket.md +65 -0
- package/backend/01-standards/search-and-filtering.md +64 -0
- package/backend/01-standards/spring-boot-complete.md +445 -0
- package/backend/02-playbooks/api-design-playbook.md +718 -0
- package/backend/02-playbooks/email-send-playbook.md +130 -0
- package/backend/02-playbooks/file-upload-s3-playbook.md +153 -0
- package/backend/02-playbooks/typescript-enterprise-playbook.md +133 -0
- package/backend/02-playbooks/websocket-realtime-playbook.md +154 -0
- package/backend/03-checklists/api-launch-checklist.md +189 -0
- package/backend/04-antipatterns/backend-antipatterns.md +1051 -0
- package/blockchain/01-standards/blockchain-basics.md +557 -0
- package/blockchain/01-standards/smart-contract-development.md +1315 -0
- package/cicd/01-standards/deployment-and-delivery-standard.md +96 -0
- package/cicd/01-standards/github-actions-complete.md +473 -0
- package/cicd/01-standards/release-and-store-submission.md +75 -0
- package/cicd/02-playbooks/cicd-pipeline-playbook.md +144 -0
- package/cicd/02-playbooks/release-management-playbook.md +605 -0
- package/cicd/03-checklists/pipeline-security-checklist.md +168 -0
- package/cicd/04-antipatterns/cicd-antipatterns.md +589 -0
- package/cicd/05-cases/case-deployment-automation.md +221 -0
- package/cicd/05-cases/case-gitops-transformation.md +212 -0
- package/cicd/06-glossary/cicd-glossary.md +114 -0
- package/cicd/cicd-blueprint-deep-dive.md +38 -0
- package/cicd/release-readiness-gate.md +37 -0
- package/cloud-native/01-standards/container-security.md +741 -0
- package/cloud-native/01-standards/kubernetes-complete.md +812 -0
- package/cloud-native/02-playbooks/api-gateway-playbook.md +155 -0
- package/cloud-native/02-playbooks/gitops-with-argocd.md +760 -0
- package/cloud-native/02-playbooks/k8s-troubleshooting-playbook.md +1942 -0
- package/cloud-native/02-playbooks/message-queue-playbook.md +129 -0
- package/cloud-native/02-playbooks/multicloud-governance.md +726 -0
- package/cloud-native/02-playbooks/serverless-patterns.md +788 -0
- package/cloud-native/02-playbooks/service-mesh-playbook.md +612 -0
- package/cloud-native/02-playbooks/terraform-iac-playbook.md +143 -0
- package/cloud-native/03-checklists/container-security-checklist.md +431 -0
- package/cloud-native/03-checklists/k8s-production-readiness-checklist.md +460 -0
- package/cloud-native/04-antipatterns/container-antipatterns.md +660 -0
- package/cloud-native/04-antipatterns/k8s-antipatterns.md +743 -0
- package/cloud-native/05-cases/case-k8s-migration.md +478 -0
- package/cloud-native/05-cases/case-k8s-scaling.md +642 -0
- package/cloud-native/05-cases/case-k8s-security-incident.md +397 -0
- package/cloud-native/06-glossary/cloud-native-glossary.md +337 -0
- package/cross-platform/01-standards/cross-platform-frameworks.md +83 -0
- package/cross-platform/01-standards/platform-selection-and-architecture.md +77 -0
- package/data/01-standards/elasticsearch-complete.md +2098 -0
- package/data/01-standards/postgresql-complete.md +1613 -0
- package/data/01-standards/redis-complete.md +1527 -0
- package/data/02-playbooks/database-optimization-playbook.md +403 -0
- package/data/02-playbooks/elasticsearch-production-playbook.md +132 -0
- package/data/03-checklists/database-launch-checklist.md +187 -0
- package/data/04-antipatterns/database-antipatterns.md +873 -0
- package/data/05-cases/case-database-migration.md +310 -0
- package/data/06-glossary/database-glossary.md +440 -0
- package/data/data-governance-and-modeling-deep-dive.md +39 -0
- package/data-engineering/01-standards/airflow-complete.md +523 -0
- package/data-engineering/01-standards/kafka-complete.md +1521 -0
- package/data-engineering/02-playbooks/spark-etl-playbook.md +496 -0
- package/data-engineering/03-checklists/pipeline-launch-checklist.md +194 -0
- package/data-engineering/04-antipatterns/data-pipeline-antipatterns.md +684 -0
- package/data-engineering/05-cases/case-real-time-pipeline.md +355 -0
- package/data-engineering/06-glossary/data-engineering-glossary.md +429 -0
- package/database/01-standards/database-schema-standards.md +147 -0
- package/database/02-playbooks/postgresql-optimization-quick.md +52 -0
- package/database/02-playbooks/postgresql-performance-optimization.md +58 -0
- package/database/02-playbooks/postgresql-production-playbook.md +146 -0
- package/database/02-playbooks/redis-caching-playbook.md +117 -0
- package/database/03-checklists/database-review-checklist.md +50 -0
- package/database/04-antipatterns/database-antipatterns.md +112 -0
- package/design/01-standards/ui-design-system-complete.md +423 -0
- package/design/02-playbooks/design-handoff-playbook.md +254 -0
- package/design/02-playbooks/design-review-playbook.md +388 -0
- package/design/03-checklists/design-review-checklist.md +246 -0
- package/design/04-antipatterns/design-antipatterns.md +378 -0
- package/design/05-cases/case-design-system-adoption.md +328 -0
- package/design/06-glossary/design-glossary.md +329 -0
- package/design/ui-full-lifecycle-cross-platform-playbook.md +571 -0
- package/design/ux-system-deep-dive.md +38 -0
- package/design-systems/00-craft-rules.md +71 -0
- package/design-systems/aesthetic-families.md +43 -0
- package/design-systems/anti-ai-slop.md +162 -0
- package/design-systems/bold-geometric.md +120 -0
- package/design-systems/brutalist-bold.md +103 -0
- package/design-systems/editorial-clean.md +109 -0
- package/design-systems/glass-aurora.md +108 -0
- package/design-systems/modern-minimal.md +145 -0
- package/design-systems/premium-luxury.md +106 -0
- package/design-systems/product-type-design-map.md +48 -0
- package/design-systems/soft-warm.md +123 -0
- package/design-systems/tech-utility.md +113 -0
- package/desktop/01-standards/desktop-app-standard.md +72 -0
- package/desktop/01-standards/desktop-design.md +71 -0
- package/development/00-governance/document-template.md +41 -0
- package/development/01-standards/api-versioning-strategies.md +432 -0
- package/development/01-standards/authentication-patterns-complete.md +479 -0
- package/development/01-standards/css-architecture-complete.md +550 -0
- package/development/01-standards/database-migration-strategies.md +484 -0
- package/development/01-standards/elasticsearch-complete.md +347 -0
- package/development/01-standards/git-complete.md +371 -0
- package/development/01-standards/golang-complete.md +1565 -0
- package/development/01-standards/graphql-complete.md +298 -0
- package/development/01-standards/javascript-bundlers-complete.md +469 -0
- package/development/01-standards/javascript-typescript-complete.md +528 -0
- package/development/01-standards/jest-complete.md +275 -0
- package/development/01-standards/linux-complete.md +234 -0
- package/development/01-standards/logging-observability-complete.md +526 -0
- package/development/01-standards/microservices-communication.md +502 -0
- package/development/01-standards/mongodb-complete.md +406 -0
- package/development/01-standards/oauth2-complete.md +285 -0
- package/development/01-standards/performance-optimization-complete.md +289 -0
- package/development/01-standards/playwright-complete.md +247 -0
- package/development/01-standards/postgresql-complete.md +456 -0
- package/development/01-standards/pytest-complete.md +340 -0
- package/development/01-standards/python-async-programming.md +902 -0
- package/development/01-standards/python-complete.md +956 -0
- package/development/01-standards/python-decorators-complete.md +799 -0
- package/development/01-standards/python-design-patterns.md +2854 -0
- package/development/01-standards/python-packaging-distribution.md +420 -0
- package/development/01-standards/python-testing-strategies.md +607 -0
- package/development/01-standards/python-web-frameworks-comparison.md +471 -0
- package/development/01-standards/redis-complete.md +317 -0
- package/development/01-standards/rest-api-complete.md +316 -0
- package/development/01-standards/rust-complete.md +578 -0
- package/development/01-standards/typescript-advanced-types.md +1513 -0
- package/development/01-standards/web-security-complete.md +292 -0
- package/development/02-playbooks/api-design-playbook.md +810 -0
- package/development/02-playbooks/database-migration-playbook.md +580 -0
- package/development/02-playbooks/debugging-playbook.md +692 -0
- package/development/02-playbooks/feature-delivery-playbook.md +430 -0
- package/development/02-playbooks/incident-hotfix-playbook.md +387 -0
- package/development/02-playbooks/performance-optimization-playbook.md +531 -0
- package/development/02-playbooks/performance-tuning-playbook.md +652 -0
- package/development/02-playbooks/refactor-playbook.md +403 -0
- package/development/02-playbooks/release-playbook.md +469 -0
- package/development/03-checklists/architecture-review-checklist.md +168 -0
- package/development/03-checklists/data-migration-checklist.md +157 -0
- package/development/03-checklists/oncall-handover-checklist.md +173 -0
- package/development/03-checklists/pr-checklist.md +158 -0
- package/development/03-checklists/production-readiness-checklist.md +190 -0
- package/development/03-checklists/release-readiness-checklist.md +154 -0
- package/development/03-checklists/security-review-checklist.md +182 -0
- package/development/04-antipatterns/api-antipatterns.md +657 -0
- package/development/04-antipatterns/architecture-antipatterns.md +686 -0
- package/development/04-antipatterns/backend-antipatterns.md +648 -0
- package/development/04-antipatterns/cicd-antipatterns.md +540 -0
- package/development/04-antipatterns/code-smell-antipatterns.md +571 -0
- package/development/04-antipatterns/data-antipatterns.md +658 -0
- package/development/04-antipatterns/database-antipatterns.md +578 -0
- package/development/04-antipatterns/frontend-antipatterns.md +635 -0
- package/development/04-antipatterns/reliability-antipatterns.md +700 -0
- package/development/04-antipatterns/security-antipatterns.md +747 -0
- package/development/05-cases/case-api-version-migration.md +428 -0
- package/development/05-cases/case-authorization-hardening.md +383 -0
- package/development/05-cases/case-bluegreen-rollback.md +466 -0
- package/development/05-cases/case-cache-snowball-protection.md +485 -0
- package/development/05-cases/case-ci-cd-pipeline.md +544 -0
- package/development/05-cases/case-database-scaling.md +500 -0
- package/development/05-cases/case-db-hotspot-optimization.md +487 -0
- package/development/05-cases/case-incident-mttr-reduction.md +563 -0
- package/development/05-cases/case-microservice-migration.md +375 -0
- package/development/05-cases/case-performance-optimization.md +406 -0
- package/development/05-cases/case-security-incident-response.md +345 -0
- package/development/06-glossary/full-stack-glossary.md +166 -0
- package/development/09-maturity/quarterly-audit-template.md +35 -0
- package/development/11-ui-excellence/ui-aesthetic-system.md +41 -0
- package/development/11-ui-excellence/ui-engineering-excellence.md +435 -0
- package/development/12-scenarios/development-scenarios-guide.md +565 -0
- package/development/13-implementation-assets/implementation-toolkit.md +282 -0
- package/development/13-implementation-assets/knowledge-gates-execution.md +43 -0
- package/development/14-full-lifecycle/software-lifecycle-gates.md +511 -0
- package/development/15-lifecycle-templates/project-templates-collection.md +791 -0
- package/development/api-contract-and-versioning-guide.md +36 -0
- package/development/api-governance-complete.md +43 -0
- package/development/backend-engineering-complete.md +43 -0
- package/development/code-review-quality-complete.md +43 -0
- package/development/concurrency-reliability-complete.md +43 -0
- package/development/database-engineering-complete.md +43 -0
- package/development/engineering-effectiveness-complete.md +43 -0
- package/development/engineering-standards-deep-dive.md +38 -0
- package/development/frontend-engineering-complete.md +43 -0
- package/development/performance-capacity-complete.md +43 -0
- package/development/refactor-migration-complete.md +42 -0
- package/development/refactoring-and-techdebt-playbook.md +37 -0
- package/development/security-in-development-complete.md +43 -0
- package/devops/01-standards/cicd-pipeline-complete.md +262 -0
- package/devops/01-standards/docker-complete.md +1490 -0
- package/devops/01-standards/github-actions-complete.md +337 -0
- package/devops/01-standards/kubernetes-complete.md +638 -0
- package/devops/01-standards/terraform-complete.md +2117 -0
- package/devops/02-playbooks/docker-compose-playbook.md +233 -0
- package/devops/02-playbooks/docker-k8s-production-playbook.md +186 -0
- package/devops/02-playbooks/docker-production-playbook.md +952 -0
- package/edge-iot/01-standards/edge-iot-complete.md +473 -0
- package/experts/architect/api-design.md +178 -0
- package/experts/architect/methodology.md +124 -0
- package/experts/architect/security.md +75 -0
- package/experts/backend-lead/methodology.md +216 -0
- package/experts/devops/methodology.md +160 -0
- package/experts/frontend-lead/methodology.md +178 -0
- package/experts/product-manager/industry/ecommerce.md +43 -0
- package/experts/product-manager/industry/saas.md +40 -0
- package/experts/product-manager/methodology.md +97 -0
- package/experts/qa-lead/methodology.md +123 -0
- package/experts/qa-lead/test-strategy.md +128 -0
- package/experts/uiux-designer/methodology.md +125 -0
- package/frontend/01-standards/accessibility-complete.md +532 -0
- package/frontend/01-standards/accessibility-standard.md +74 -0
- package/frontend/01-standards/admin-dashboard-and-crud.md +72 -0
- package/frontend/01-standards/design-tokens-complete.md +444 -0
- package/frontend/01-standards/forms-and-validation.md +77 -0
- package/frontend/01-standards/frontend-architecture-and-layering.md +119 -0
- package/frontend/01-standards/i18n-and-localization.md +65 -0
- package/frontend/01-standards/nextjs-complete.md +451 -0
- package/frontend/01-standards/react-complete.md +713 -0
- package/frontend/01-standards/react-hooks-complete-guide.md +1100 -0
- package/frontend/01-standards/react-hooks-complete.md +1171 -0
- package/frontend/01-standards/seo-and-web-vitals.md +77 -0
- package/frontend/01-standards/state-management-complete.md +444 -0
- package/frontend/01-standards/vue-complete.md +499 -0
- package/frontend/01-standards/vue3-complete.md +2002 -0
- package/frontend/01-standards/web-framework-best-practices.md +64 -0
- package/frontend/01-standards/web-performance-complete.md +495 -0
- package/frontend/02-playbooks/accessibility-a11y-playbook.md +161 -0
- package/frontend/02-playbooks/frontend-performance-playbook.md +707 -0
- package/frontend/02-playbooks/i18n-internationalization-playbook.md +120 -0
- package/frontend/02-playbooks/performance-optimization-playbook.md +163 -0
- package/frontend/02-playbooks/react-nextjs-production-playbook.md +167 -0
- package/frontend/02-playbooks/react-state-management-playbook.md +173 -0
- package/frontend/03-checklists/component-quality-checklist.md +166 -0
- package/frontend/03-checklists/frontend-launch-checklist.md +299 -0
- package/frontend/04-antipatterns/frontend-antipatterns.md +886 -0
- package/frontend/05-cases/case-performance-optimization.md +274 -0
- package/harmony/01-standards/harmonyos-arkts-standard.md +75 -0
- package/harmony/01-standards/harmonyos-design.md +65 -0
- package/high-quality-engineering-playbook.md +54 -0
- package/incident/01-standards/incident-response-complete.md +303 -0
- package/incident/02-playbooks/chaos-engineering-playbook.md +883 -0
- package/incident/02-playbooks/postmortem-playbook.md +398 -0
- package/incident/03-checklists/incident-readiness-checklist.md +181 -0
- package/incident/04-antipatterns/incident-antipatterns.md +490 -0
- package/incident/05-cases/case-cascade-failure.md +176 -0
- package/incident/06-glossary/incident-glossary.md +114 -0
- package/incident/postmortem-and-response-deep-dive.md +39 -0
- package/industries/ecommerce/ecommerce-complete.md +631 -0
- package/industries/education/education-complete.md +555 -0
- package/industries/fintech/fintech-complete.md +501 -0
- package/industries/gaming/gaming-complete.md +587 -0
- package/industries/healthcare/healthcare-complete.md +452 -0
- package/low-code/01-standards/low-code-complete.md +944 -0
- package/miniprogram/01-standards/ai-common-mistakes.md +61 -0
- package/miniprogram/01-standards/miniprogram-custom-navbar-capsule.md +77 -0
- package/miniprogram/01-standards/miniprogram-design.md +61 -0
- package/miniprogram/01-standards/miniprogram-standard.md +81 -0
- package/mobile/01-standards/android-material-design.md +70 -0
- package/mobile/01-standards/flutter-complete.md +384 -0
- package/mobile/01-standards/ios-design-hig.md +78 -0
- package/mobile/01-standards/mobile-app-standard.md +85 -0
- package/mobile/01-standards/react-native-complete.md +352 -0
- package/mobile/02-playbooks/mobile-cross-platform-playbook.md +175 -0
- package/mobile/02-playbooks/mobile-performance.md +473 -0
- package/mobile/03-checklists/mobile-release-checklist.md +234 -0
- package/mobile/04-antipatterns/mobile-antipatterns.md +798 -0
- package/mobile/05-cases/case-app-performance.md +500 -0
- package/mobile/05-cases/case-app-startup-optimization.md +218 -0
- package/mobile/06-glossary/mobile-glossary.md +484 -0
- package/observability/01-standards/observability-standards.md +103 -0
- package/observability/02-playbooks/prometheus-grafana-playbook.md +135 -0
- package/observability/02-playbooks/structured-logging-playbook.md +73 -0
- package/observability/03-checklists/observability-checklist.md +54 -0
- package/observability/04-antipatterns/observability-antipatterns.md +106 -0
- package/operations/01-standards/prometheus-monitoring-complete.md +1578 -0
- package/operations/02-playbooks/capacity-planning-playbook.md +620 -0
- package/operations/03-checklists/production-launch-checklist.md +365 -0
- package/operations/04-antipatterns/operations-antipatterns.md +664 -0
- package/operations/05-cases/case-sre-practices.md +581 -0
- package/operations/06-glossary/operations-glossary.md +120 -0
- package/operations/aiops-anomaly-detection.md +758 -0
- package/operations/capacity-planning.md +1061 -0
- package/operations/chaos-engineering.md +659 -0
- package/operations/incident-command-system.md +38 -0
- package/operations/observability-complete.md +442 -0
- package/operations/slo-sli-playbook.md +517 -0
- package/operations/sre-operations-deep-dive.md +39 -0
- package/package.json +8 -0
- package/performance/01-standards/performance-and-scalability.md +80 -0
- package/performance/01-standards/performance-standards.md +156 -0
- package/performance/02-playbooks/query-optimization-playbook.md +103 -0
- package/performance/03-checklists/performance-checklist.md +56 -0
- package/performance/04-antipatterns/performance-antipatterns.md +146 -0
- package/product/01-standards/product-management-complete.md +285 -0
- package/product/02-playbooks/feature-launch-playbook.md +207 -0
- package/product/02-playbooks/user-research-playbook.md +532 -0
- package/product/03-checklists/feature-launch-checklist.md +275 -0
- package/product/04-antipatterns/product-antipatterns.md +355 -0
- package/product/05-cases/case-mvp-to-scale.md +384 -0
- package/product/06-glossary/product-glossary.md +462 -0
- package/product/feature-prioritization-framework.md +40 -0
- package/product/kpi-and-metric-tree.md +37 -0
- package/product/product-discovery-and-prd-deep-dive.md +41 -0
- package/quantum/01-standards/quantum-complete.md +1186 -0
- package/security/01-standards/api-security-complete.md +511 -0
- package/security/01-standards/container-runtime-security.md +574 -0
- package/security/01-standards/data-protection-gdpr.md +543 -0
- package/security/01-standards/owasp-top10-complete.md +1890 -0
- package/security/01-standards/secure-coding-baseline.md +90 -0
- package/security/01-standards/supply-chain-security.md +441 -0
- package/security/01-standards/web-security-checklist.md +108 -0
- package/security/01-standards/zero-trust-architecture.md +521 -0
- package/security/02-playbooks/auth-sso-playbook.md +166 -0
- package/security/02-playbooks/incident-response-security-playbook.md +588 -0
- package/security/02-playbooks/owasp-api-security-playbook.md +129 -0
- package/security/02-playbooks/payment-integration-playbook.md +119 -0
- package/security/02-playbooks/penetration-testing-playbook.md +517 -0
- package/security/03-checklists/security-audit-checklist.md +356 -0
- package/security/04-antipatterns/security-coding-antipatterns.md +580 -0
- package/security/05-cases/case-log4shell-incident.md +537 -0
- package/security/05-cases/case-major-breaches.md +468 -0
- package/security/06-glossary/security-glossary.md +212 -0
- package/security/compliance-automation.md +993 -0
- package/security/container-security.md +680 -0
- package/security/devsecops-complete.md +426 -0
- package/security/sast-dast-sca.md +775 -0
- package/security/secrets-management.md +594 -0
- package/security/security-architecture-deep-dive.md +37 -0
- package/security/threat-modeling-stride-playbook.md +40 -0
- package/seed-templates/auth-system.md +59 -0
- package/seed-templates/blog-content.md +94 -0
- package/seed-templates/dashboard.md +89 -0
- package/seed-templates/docs-site.md +73 -0
- package/seed-templates/e-commerce.md +50 -0
- package/seed-templates/saas-landing.md +92 -0
- package/seed-templates/settings-page.md +51 -0
- package/testing/01-standards/test-strategy-and-layering.md +83 -0
- package/testing/01-standards/testing-strategy-complete.md +422 -0
- package/testing/01-standards/unit-testing-best-practices.md +118 -0
- package/testing/02-playbooks/e2e-testing-playbook.md +988 -0
- package/testing/02-playbooks/testing-strategy-playbook.md +126 -0
- package/testing/03-checklists/test-strategy-checklist.md +208 -0
- package/testing/04-antipatterns/testing-antipatterns.md +718 -0
- package/testing/05-cases/case-testing-transformation.md +300 -0
- package/testing/06-glossary/testing-glossary.md +110 -0
- package/testing/risk-based-test-matrix.md +36 -0
- package/testing/testing-strategy-deep-dive.md +37 -0
|
@@ -0,0 +1,799 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: python-decorators-complete
|
|
3
|
+
title: Python 装饰器完全指南
|
|
4
|
+
domain: development
|
|
5
|
+
category: 01-standards
|
|
6
|
+
difficulty: intermediate
|
|
7
|
+
tags: [python, decorators, metaprogramming, advanced]
|
|
8
|
+
quality_score: 92
|
|
9
|
+
maintainer: python-team@umadev.com
|
|
10
|
+
last_updated: 2026-03-29
|
|
11
|
+
version: 2.0
|
|
12
|
+
related_knowledge:
|
|
13
|
+
- python-context-managers
|
|
14
|
+
- python-generators
|
|
15
|
+
- python-metaclasses
|
|
16
|
+
prerequisites:
|
|
17
|
+
- python-complete
|
|
18
|
+
- python-type-system
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Python 装饰器完全指南
|
|
22
|
+
|
|
23
|
+
## 概述
|
|
24
|
+
|
|
25
|
+
装饰器是 Python 最强大的特性之一,它允许在不修改原函数代码的情况下,动态地扩展或修改函数的行为。装饰器本质上是接受一个函数作为参数并返回一个新函数的高阶函数,广泛应用于日志记录、性能监控、权限检查、缓存等场景。
|
|
26
|
+
|
|
27
|
+
理解装饰器需要掌握闭包、高阶函数、`*args` 和 `**kwargs` 等概念。本指南将从基础到高级,全面讲解装饰器的原理、用法和最佳实践。
|
|
28
|
+
|
|
29
|
+
## 核心概念
|
|
30
|
+
|
|
31
|
+
### 1. 装饰器的基本原理
|
|
32
|
+
|
|
33
|
+
装饰器利用了 Python 的两个核心特性:
|
|
34
|
+
1. **函数是一等公民**: 函数可以作为参数传递、作为返回值、赋值给变量
|
|
35
|
+
2. **闭包**: 内部函数可以访问外部函数的变量,即使外部函数已经返回
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
# 最简单的装饰器
|
|
39
|
+
def my_decorator(func):
|
|
40
|
+
def wrapper():
|
|
41
|
+
print("Before function call")
|
|
42
|
+
result = func()
|
|
43
|
+
print("After function call")
|
|
44
|
+
return result
|
|
45
|
+
return wrapper
|
|
46
|
+
|
|
47
|
+
# 使用装饰器
|
|
48
|
+
@my_decorator
|
|
49
|
+
def say_hello():
|
|
50
|
+
print("Hello!")
|
|
51
|
+
|
|
52
|
+
# 等价于
|
|
53
|
+
say_hello = my_decorator(say_hello)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 2. 装饰器的执行流程
|
|
57
|
+
|
|
58
|
+
```mermaid
|
|
59
|
+
sequenceDiagram
|
|
60
|
+
participant Code as 调用代码
|
|
61
|
+
participant Decorator as 装饰器
|
|
62
|
+
participant Wrapper as 包装函数
|
|
63
|
+
participant Original as 原函数
|
|
64
|
+
|
|
65
|
+
Code->>Decorator: @decorator 定义时
|
|
66
|
+
Decorator->>Original: 接收原函数
|
|
67
|
+
Decorator->>Wrapper: 创建包装函数
|
|
68
|
+
Decorator-->>Code: 返回包装函数
|
|
69
|
+
|
|
70
|
+
Code->>Wrapper: 调用函数
|
|
71
|
+
Wrapper->>Wrapper: 前置处理
|
|
72
|
+
Wrapper->>Original: 执行原函数
|
|
73
|
+
Original-->>Wrapper: 返回结果
|
|
74
|
+
Wrapper->>Wrapper: 后置处理
|
|
75
|
+
Wrapper-->>Code: 返回最终结果
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 3. 带参数的装饰器
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
from functools import wraps
|
|
82
|
+
|
|
83
|
+
def decorator_with_args(arg1, arg2):
|
|
84
|
+
"""带参数的装饰器"""
|
|
85
|
+
def actual_decorator(func):
|
|
86
|
+
@wraps(func)
|
|
87
|
+
def wrapper(*args, **kwargs):
|
|
88
|
+
print(f"Decorator args: {arg1}, {arg2}")
|
|
89
|
+
return func(*args, **kwargs)
|
|
90
|
+
return wrapper
|
|
91
|
+
return actual_decorator
|
|
92
|
+
|
|
93
|
+
@decorator_with_args("hello", "world")
|
|
94
|
+
def my_function(x, y):
|
|
95
|
+
return x + y
|
|
96
|
+
|
|
97
|
+
# 执行
|
|
98
|
+
result = my_function(3, 5)
|
|
99
|
+
# 输出: Decorator args: hello, world
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 实现指南
|
|
103
|
+
|
|
104
|
+
### 基础装饰器模式
|
|
105
|
+
|
|
106
|
+
#### 1. 简单装饰器
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
from functools import wraps
|
|
110
|
+
import time
|
|
111
|
+
|
|
112
|
+
def timer(func):
|
|
113
|
+
"""测量函数执行时间的装饰器"""
|
|
114
|
+
@wraps(func)
|
|
115
|
+
def wrapper(*args, **kwargs):
|
|
116
|
+
start_time = time.perf_counter()
|
|
117
|
+
result = func(*args, **kwargs)
|
|
118
|
+
end_time = time.perf_counter()
|
|
119
|
+
print(f"{func.__name__} executed in {end_time - start_time:.4f} seconds")
|
|
120
|
+
return result
|
|
121
|
+
return wrapper
|
|
122
|
+
|
|
123
|
+
@timer
|
|
124
|
+
def slow_function():
|
|
125
|
+
time.sleep(1)
|
|
126
|
+
return "Done"
|
|
127
|
+
|
|
128
|
+
slow_function()
|
|
129
|
+
# 输出: slow_function executed in 1.0012 seconds
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**关键点**:
|
|
133
|
+
- 使用 `@wraps(func)` 保留原函数的元数据(`__name__`, `__doc__` 等)
|
|
134
|
+
- 使用 `*args, **kwargs` 支持任意参数
|
|
135
|
+
- 始终返回原函数的结果
|
|
136
|
+
|
|
137
|
+
#### 2. 带参数的装饰器
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
from functools import wraps
|
|
141
|
+
|
|
142
|
+
def repeat(times):
|
|
143
|
+
"""重复执行函数指定次数"""
|
|
144
|
+
def decorator(func):
|
|
145
|
+
@wraps(func)
|
|
146
|
+
def wrapper(*args, **kwargs):
|
|
147
|
+
results = []
|
|
148
|
+
for i in range(times):
|
|
149
|
+
result = func(*args, **kwargs)
|
|
150
|
+
results.append(result)
|
|
151
|
+
return results
|
|
152
|
+
return wrapper
|
|
153
|
+
return decorator
|
|
154
|
+
|
|
155
|
+
@repeat(times=3)
|
|
156
|
+
def greet(name):
|
|
157
|
+
return f"Hello, {name}!"
|
|
158
|
+
|
|
159
|
+
print(greet("Alice"))
|
|
160
|
+
# 输出: ['Hello, Alice!', 'Hello, Alice!', 'Hello, Alice!']
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### 3. 类装饰器
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
class CountCalls:
|
|
167
|
+
"""统计函数调用次数的类装饰器"""
|
|
168
|
+
|
|
169
|
+
def __init__(self, func):
|
|
170
|
+
self.func = func
|
|
171
|
+
self.count = 0
|
|
172
|
+
self.__name__ = func.__name__
|
|
173
|
+
|
|
174
|
+
def __call__(self, *args, **kwargs):
|
|
175
|
+
self.count += 1
|
|
176
|
+
print(f"Call {self.count} of {self.func.__name__}")
|
|
177
|
+
return self.func(*args, **kwargs)
|
|
178
|
+
|
|
179
|
+
@CountCalls
|
|
180
|
+
def say_hello():
|
|
181
|
+
print("Hello!")
|
|
182
|
+
|
|
183
|
+
say_hello() # Call 1 of say_hello
|
|
184
|
+
say_hello() # Call 2 of say_hello
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 高级装饰器模式
|
|
188
|
+
|
|
189
|
+
#### 1. 装饰器栈(多个装饰器组合)
|
|
190
|
+
|
|
191
|
+
```python
|
|
192
|
+
@decorator1
|
|
193
|
+
@decorator2
|
|
194
|
+
@decorator3
|
|
195
|
+
def my_function():
|
|
196
|
+
pass
|
|
197
|
+
|
|
198
|
+
# 等价于
|
|
199
|
+
my_function = decorator1(decorator2(decorator3(my_function)))
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**执行顺序**: 从下到上应用,从外到内执行
|
|
203
|
+
|
|
204
|
+
```mermaid
|
|
205
|
+
graph TD
|
|
206
|
+
A[调用 my_function] --> B[decorator1 前置]
|
|
207
|
+
B --> C[decorator2 前置]
|
|
208
|
+
C --> D[decorator3 前置]
|
|
209
|
+
D --> E[执行原函数]
|
|
210
|
+
E --> F[decorator3 后置]
|
|
211
|
+
F --> G[decorator2 后置]
|
|
212
|
+
G --> H[decorator1 后置]
|
|
213
|
+
H --> I[返回结果]
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
#### 2. 可选参数装饰器
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
from functools import wraps
|
|
220
|
+
|
|
221
|
+
def smart_decorator(_func=None, *, option1="default", option2=True):
|
|
222
|
+
"""既可以带参数使用,也可以不带参数使用"""
|
|
223
|
+
def decorator(func):
|
|
224
|
+
@wraps(func)
|
|
225
|
+
def wrapper(*args, **kwargs):
|
|
226
|
+
print(f"Options: option1={option1}, option2={option2}")
|
|
227
|
+
return func(*args, **kwargs)
|
|
228
|
+
return wrapper
|
|
229
|
+
|
|
230
|
+
# 如果直接调用 @smart_decorator
|
|
231
|
+
if _func is None:
|
|
232
|
+
return decorator
|
|
233
|
+
# 如果带参数调用 @smart_decorator()
|
|
234
|
+
else:
|
|
235
|
+
return decorator(_func)
|
|
236
|
+
|
|
237
|
+
# 使用方式 1: 不带参数
|
|
238
|
+
@smart_decorator
|
|
239
|
+
def func1():
|
|
240
|
+
pass
|
|
241
|
+
|
|
242
|
+
# 使用方式 2: 带参数
|
|
243
|
+
@smart_decorator(option1="custom", option2=False)
|
|
244
|
+
def func2():
|
|
245
|
+
pass
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
#### 3. 异步装饰器
|
|
249
|
+
|
|
250
|
+
```python
|
|
251
|
+
from functools import wraps
|
|
252
|
+
import asyncio
|
|
253
|
+
|
|
254
|
+
def async_timer(func):
|
|
255
|
+
"""异步函数计时装饰器"""
|
|
256
|
+
@wraps(func)
|
|
257
|
+
async def wrapper(*args, **kwargs):
|
|
258
|
+
start = asyncio.get_event_loop().time()
|
|
259
|
+
result = await func(*args, **kwargs)
|
|
260
|
+
end = asyncio.get_event_loop().time()
|
|
261
|
+
print(f"{func.__name__} took {end - start:.4f} seconds")
|
|
262
|
+
return result
|
|
263
|
+
return wrapper
|
|
264
|
+
|
|
265
|
+
@async_timer
|
|
266
|
+
async def async_task():
|
|
267
|
+
await asyncio.sleep(1)
|
|
268
|
+
return "Async done"
|
|
269
|
+
|
|
270
|
+
# 执行
|
|
271
|
+
asyncio.run(async_task())
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
#### 4. 装饰器工厂
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
from functools import wraps
|
|
278
|
+
|
|
279
|
+
class DecoratorFactory:
|
|
280
|
+
"""动态创建装饰器的工厂"""
|
|
281
|
+
|
|
282
|
+
@staticmethod
|
|
283
|
+
def create_logger(log_level="INFO"):
|
|
284
|
+
def decorator(func):
|
|
285
|
+
@wraps(func)
|
|
286
|
+
def wrapper(*args, **kwargs):
|
|
287
|
+
print(f"[{log_level}] Calling {func.__name__}")
|
|
288
|
+
result = func(*args, **kwargs)
|
|
289
|
+
print(f"[{log_level}] {func.__name__} returned")
|
|
290
|
+
return result
|
|
291
|
+
return wrapper
|
|
292
|
+
return decorator
|
|
293
|
+
|
|
294
|
+
# 使用
|
|
295
|
+
info_logger = DecoratorFactory.create_logger("INFO")
|
|
296
|
+
debug_logger = DecoratorFactory.create_logger("DEBUG")
|
|
297
|
+
|
|
298
|
+
@info_logger
|
|
299
|
+
def important_function():
|
|
300
|
+
return "Important result"
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## 实战案例
|
|
304
|
+
|
|
305
|
+
### 案例 1: 缓存装饰器 (Memoization)
|
|
306
|
+
|
|
307
|
+
```python
|
|
308
|
+
from functools import wraps
|
|
309
|
+
|
|
310
|
+
def memoize(func):
|
|
311
|
+
"""缓存函数结果"""
|
|
312
|
+
cache = {}
|
|
313
|
+
|
|
314
|
+
@wraps(func)
|
|
315
|
+
def wrapper(*args):
|
|
316
|
+
if args not in cache:
|
|
317
|
+
cache[args] = func(*args)
|
|
318
|
+
return cache[args]
|
|
319
|
+
|
|
320
|
+
wrapper.cache = cache # 暴露缓存供外部访问
|
|
321
|
+
return wrapper
|
|
322
|
+
|
|
323
|
+
@memoize
|
|
324
|
+
def fibonacci(n):
|
|
325
|
+
"""斐波那契数列"""
|
|
326
|
+
if n < 2:
|
|
327
|
+
return n
|
|
328
|
+
return fibonacci(n - 1) + fibonacci(n - 2)
|
|
329
|
+
|
|
330
|
+
# 测试
|
|
331
|
+
print(fibonacci(100)) # 第一次计算
|
|
332
|
+
print(fibonacci(100)) # 从缓存读取
|
|
333
|
+
print(fibonacci.cache) # 查看缓存
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### 案例 2: 重试装饰器
|
|
337
|
+
|
|
338
|
+
```python
|
|
339
|
+
from functools import wraps
|
|
340
|
+
import time
|
|
341
|
+
from typing import Callable, Type
|
|
342
|
+
|
|
343
|
+
def retry(
|
|
344
|
+
max_attempts: int = 3,
|
|
345
|
+
delay: float = 1.0,
|
|
346
|
+
exceptions: tuple = (Exception,),
|
|
347
|
+
backoff: float = 2.0
|
|
348
|
+
):
|
|
349
|
+
"""自动重试装饰器"""
|
|
350
|
+
def decorator(func):
|
|
351
|
+
@wraps(func)
|
|
352
|
+
def wrapper(*args, **kwargs):
|
|
353
|
+
attempts = 0
|
|
354
|
+
current_delay = delay
|
|
355
|
+
|
|
356
|
+
while attempts < max_attempts:
|
|
357
|
+
try:
|
|
358
|
+
return func(*args, **kwargs)
|
|
359
|
+
except exceptions as e:
|
|
360
|
+
attempts += 1
|
|
361
|
+
if attempts == max_attempts:
|
|
362
|
+
raise
|
|
363
|
+
|
|
364
|
+
print(f"Attempt {attempts} failed: {e}")
|
|
365
|
+
print(f"Retrying in {current_delay} seconds...")
|
|
366
|
+
time.sleep(current_delay)
|
|
367
|
+
current_delay *= backoff
|
|
368
|
+
|
|
369
|
+
return wrapper
|
|
370
|
+
return decorator
|
|
371
|
+
|
|
372
|
+
# 使用
|
|
373
|
+
@retry(max_attempts=3, delay=1.0, exceptions=(ConnectionError,))
|
|
374
|
+
def fetch_data(url):
|
|
375
|
+
import random
|
|
376
|
+
if random.random() < 0.7:
|
|
377
|
+
raise ConnectionError("Network error")
|
|
378
|
+
return f"Data from {url}"
|
|
379
|
+
|
|
380
|
+
fetch_data("https://api.example.com")
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### 案例 3: 权限检查装饰器
|
|
384
|
+
|
|
385
|
+
```python
|
|
386
|
+
from functools import wraps
|
|
387
|
+
from typing import List
|
|
388
|
+
|
|
389
|
+
def require_permissions(*required_permissions: str):
|
|
390
|
+
"""权限检查装饰器"""
|
|
391
|
+
def decorator(func):
|
|
392
|
+
@wraps(func)
|
|
393
|
+
def wrapper(user_permissions: List[str], *args, **kwargs):
|
|
394
|
+
# 检查用户是否拥有所有必需权限
|
|
395
|
+
missing = set(required_permissions) - set(user_permissions)
|
|
396
|
+
if missing:
|
|
397
|
+
raise PermissionError(
|
|
398
|
+
f"Missing required permissions: {missing}"
|
|
399
|
+
)
|
|
400
|
+
return func(*args, **kwargs)
|
|
401
|
+
return wrapper
|
|
402
|
+
return decorator
|
|
403
|
+
|
|
404
|
+
# 使用
|
|
405
|
+
@require_permissions("admin", "write")
|
|
406
|
+
def delete_user(user_id):
|
|
407
|
+
return f"User {user_id} deleted"
|
|
408
|
+
|
|
409
|
+
# 测试
|
|
410
|
+
try:
|
|
411
|
+
delete_user(["admin", "write"], user_id=123) # 成功
|
|
412
|
+
delete_user(["read"], user_id=456) # 抛出 PermissionError
|
|
413
|
+
except PermissionError as e:
|
|
414
|
+
print(e)
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### 案例 4: 单例模式装饰器
|
|
418
|
+
|
|
419
|
+
```python
|
|
420
|
+
from functools import wraps
|
|
421
|
+
|
|
422
|
+
def singleton(cls):
|
|
423
|
+
"""单例装饰器"""
|
|
424
|
+
instances = {}
|
|
425
|
+
|
|
426
|
+
@wraps(cls)
|
|
427
|
+
def get_instance(*args, **kwargs):
|
|
428
|
+
if cls not in instances:
|
|
429
|
+
instances[cls] = cls(*args, **kwargs)
|
|
430
|
+
return instances[cls]
|
|
431
|
+
|
|
432
|
+
return get_instance
|
|
433
|
+
|
|
434
|
+
@singleton
|
|
435
|
+
class Database:
|
|
436
|
+
def __init__(self, connection_string):
|
|
437
|
+
self.connection_string = connection_string
|
|
438
|
+
print(f"Creating database connection: {connection_string}")
|
|
439
|
+
|
|
440
|
+
# 测试
|
|
441
|
+
db1 = Database("mysql://localhost/db")
|
|
442
|
+
db2 = Database("mysql://localhost/db")
|
|
443
|
+
print(db1 is db2) # True
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
### 案例 5: 类型检查装饰器
|
|
447
|
+
|
|
448
|
+
```python
|
|
449
|
+
from functools import wraps
|
|
450
|
+
from typing import get_type_hints
|
|
451
|
+
import inspect
|
|
452
|
+
|
|
453
|
+
def validate_types(func):
|
|
454
|
+
"""运行时类型检查装饰器"""
|
|
455
|
+
@wraps(func)
|
|
456
|
+
def wrapper(*args, **kwargs):
|
|
457
|
+
# 获取类型提示
|
|
458
|
+
hints = get_type_hints(func)
|
|
459
|
+
sig = inspect.signature(func)
|
|
460
|
+
bound_args = sig.bind(*args, **kwargs)
|
|
461
|
+
bound_args.apply_defaults()
|
|
462
|
+
|
|
463
|
+
# 检查参数类型
|
|
464
|
+
for param_name, value in bound_args.arguments.items():
|
|
465
|
+
if param_name in hints:
|
|
466
|
+
expected_type = hints[param_name]
|
|
467
|
+
if not isinstance(value, expected_type):
|
|
468
|
+
raise TypeError(
|
|
469
|
+
f"Parameter '{param_name}' expected {expected_type}, "
|
|
470
|
+
f"got {type(value)}"
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
# 执行函数
|
|
474
|
+
result = func(*args, **kwargs)
|
|
475
|
+
|
|
476
|
+
# 检查返回值类型
|
|
477
|
+
if 'return' in hints:
|
|
478
|
+
expected_return = hints['return']
|
|
479
|
+
if not isinstance(result, expected_return):
|
|
480
|
+
raise TypeError(
|
|
481
|
+
f"Return value expected {expected_return}, "
|
|
482
|
+
f"got {type(result)}"
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
return result
|
|
486
|
+
|
|
487
|
+
return wrapper
|
|
488
|
+
|
|
489
|
+
# 使用
|
|
490
|
+
@validate_types
|
|
491
|
+
def add_numbers(a: int, b: int) -> int:
|
|
492
|
+
return a + b
|
|
493
|
+
|
|
494
|
+
add_numbers(3, 5) # 正常
|
|
495
|
+
add_numbers(3, "5") # TypeError
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
## 最佳实践
|
|
499
|
+
|
|
500
|
+
### 1. 始终使用 functools.wraps
|
|
501
|
+
|
|
502
|
+
```python
|
|
503
|
+
# ❌ 错误: 丢失元数据
|
|
504
|
+
def bad_decorator(func):
|
|
505
|
+
def wrapper(*args, **kwargs):
|
|
506
|
+
return func(*args, **kwargs)
|
|
507
|
+
return wrapper
|
|
508
|
+
|
|
509
|
+
@bad_decorator
|
|
510
|
+
def example():
|
|
511
|
+
"""This is an example function"""
|
|
512
|
+
pass
|
|
513
|
+
|
|
514
|
+
print(example.__name__) # wrapper (错误!)
|
|
515
|
+
print(example.__doc__) # None (错误!)
|
|
516
|
+
|
|
517
|
+
# ✅ 正确: 保留元数据
|
|
518
|
+
from functools import wraps
|
|
519
|
+
|
|
520
|
+
def good_decorator(func):
|
|
521
|
+
@wraps(func)
|
|
522
|
+
def wrapper(*args, **kwargs):
|
|
523
|
+
return func(*args, **kwargs)
|
|
524
|
+
return wrapper
|
|
525
|
+
|
|
526
|
+
@good_decorator
|
|
527
|
+
def example():
|
|
528
|
+
"""This is an example function"""
|
|
529
|
+
pass
|
|
530
|
+
|
|
531
|
+
print(example.__name__) # example (正确!)
|
|
532
|
+
print(example.__doc__) # This is an example function (正确!)
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### 2. 保持装饰器简洁
|
|
536
|
+
|
|
537
|
+
```python
|
|
538
|
+
# ❌ 错误: 装饰器做太多事情
|
|
539
|
+
def bad_decorator(func):
|
|
540
|
+
@wraps(func)
|
|
541
|
+
def wrapper(*args, **kwargs):
|
|
542
|
+
# 日志记录
|
|
543
|
+
# 权限检查
|
|
544
|
+
# 缓存检查
|
|
545
|
+
# 性能监控
|
|
546
|
+
# 重试逻辑
|
|
547
|
+
# ... 太多职责
|
|
548
|
+
return func(*args, **kwargs)
|
|
549
|
+
return wrapper
|
|
550
|
+
|
|
551
|
+
# ✅ 正确: 单一职责,组合使用
|
|
552
|
+
@log_calls
|
|
553
|
+
@check_permissions
|
|
554
|
+
@cache_result
|
|
555
|
+
@monitor_performance
|
|
556
|
+
def good_function():
|
|
557
|
+
pass
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
### 3. 正确处理异常
|
|
561
|
+
|
|
562
|
+
```python
|
|
563
|
+
from functools import wraps
|
|
564
|
+
|
|
565
|
+
def safe_decorator(func):
|
|
566
|
+
@wraps(func)
|
|
567
|
+
def wrapper(*args, **kwargs):
|
|
568
|
+
try:
|
|
569
|
+
return func(*args, **kwargs)
|
|
570
|
+
except Exception as e:
|
|
571
|
+
# 记录异常但不要吞掉它
|
|
572
|
+
print(f"Error in {func.__name__}: {e}")
|
|
573
|
+
raise # 重新抛出异常
|
|
574
|
+
return wrapper
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
### 4. 文档化装饰器
|
|
578
|
+
|
|
579
|
+
```python
|
|
580
|
+
from functools import wraps
|
|
581
|
+
|
|
582
|
+
def documented_decorator(func):
|
|
583
|
+
"""
|
|
584
|
+
示例装饰器,展示如何文档化装饰器。
|
|
585
|
+
|
|
586
|
+
Args:
|
|
587
|
+
func: 被装饰的函数
|
|
588
|
+
|
|
589
|
+
Returns:
|
|
590
|
+
包装后的函数
|
|
591
|
+
|
|
592
|
+
Example:
|
|
593
|
+
@documented_decorator
|
|
594
|
+
def my_function():
|
|
595
|
+
pass
|
|
596
|
+
"""
|
|
597
|
+
@wraps(func)
|
|
598
|
+
def wrapper(*args, **kwargs):
|
|
599
|
+
"""包装函数的文档字符串"""
|
|
600
|
+
return func(*args, **kwargs)
|
|
601
|
+
|
|
602
|
+
# 添加额外的文档
|
|
603
|
+
wrapper._decorator_name = "documented_decorator"
|
|
604
|
+
return wrapper
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
### 5. 线程安全
|
|
608
|
+
|
|
609
|
+
```python
|
|
610
|
+
from functools import wraps
|
|
611
|
+
import threading
|
|
612
|
+
|
|
613
|
+
def thread_safe(func):
|
|
614
|
+
"""线程安全装饰器"""
|
|
615
|
+
lock = threading.Lock()
|
|
616
|
+
|
|
617
|
+
@wraps(func)
|
|
618
|
+
def wrapper(*args, **kwargs):
|
|
619
|
+
with lock:
|
|
620
|
+
return func(*args, **kwargs)
|
|
621
|
+
|
|
622
|
+
return wrapper
|
|
623
|
+
|
|
624
|
+
@thread_safe
|
|
625
|
+
def increment_counter(counter):
|
|
626
|
+
counter['value'] += 1
|
|
627
|
+
return counter['value']
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
## 常见陷阱
|
|
631
|
+
|
|
632
|
+
### 1. 忘记返回原函数结果
|
|
633
|
+
|
|
634
|
+
```python
|
|
635
|
+
# ❌ 错误
|
|
636
|
+
def bad_decorator(func):
|
|
637
|
+
def wrapper(*args, **kwargs):
|
|
638
|
+
func(*args, **kwargs) # 没有返回结果!
|
|
639
|
+
return wrapper
|
|
640
|
+
|
|
641
|
+
# ✅ 正确
|
|
642
|
+
def good_decorator(func):
|
|
643
|
+
@wraps(func)
|
|
644
|
+
def wrapper(*args, **kwargs):
|
|
645
|
+
return func(*args, **kwargs) # 返回结果
|
|
646
|
+
return wrapper
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
### 2. 装饰器参数错误
|
|
650
|
+
|
|
651
|
+
```python
|
|
652
|
+
# ❌ 错误: 忘记调用装饰器工厂
|
|
653
|
+
@retry # 缺少括号
|
|
654
|
+
def my_function():
|
|
655
|
+
pass
|
|
656
|
+
|
|
657
|
+
# ✅ 正确
|
|
658
|
+
@retry() # 带括号
|
|
659
|
+
def my_function():
|
|
660
|
+
pass
|
|
661
|
+
|
|
662
|
+
# 或者使用可选参数模式
|
|
663
|
+
def retry(_func=None, *, max_attempts=3):
|
|
664
|
+
def decorator(func):
|
|
665
|
+
@wraps(func)
|
|
666
|
+
def wrapper(*args, **kwargs):
|
|
667
|
+
for _ in range(max_attempts):
|
|
668
|
+
try:
|
|
669
|
+
return func(*args, **kwargs)
|
|
670
|
+
except Exception:
|
|
671
|
+
pass
|
|
672
|
+
return wrapper
|
|
673
|
+
|
|
674
|
+
if _func is None:
|
|
675
|
+
return decorator
|
|
676
|
+
else:
|
|
677
|
+
return decorator(_func)
|
|
678
|
+
|
|
679
|
+
# 现在两种方式都支持
|
|
680
|
+
@retry
|
|
681
|
+
def func1():
|
|
682
|
+
pass
|
|
683
|
+
|
|
684
|
+
@retry(max_attempts=5)
|
|
685
|
+
def func2():
|
|
686
|
+
pass
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### 3. 闭包变量陷阱
|
|
690
|
+
|
|
691
|
+
```python
|
|
692
|
+
# ❌ 错误: 闭包中的循环变量
|
|
693
|
+
def create_multipliers():
|
|
694
|
+
return [lambda x: x * i for i in range(5)]
|
|
695
|
+
|
|
696
|
+
multipliers = create_multipliers()
|
|
697
|
+
print(multipliers[0](10)) # 40 (期望 0)
|
|
698
|
+
print(multipliers[1](10)) # 40 (期望 10)
|
|
699
|
+
|
|
700
|
+
# ✅ 正确: 使用默认参数捕获变量
|
|
701
|
+
def create_multipliers():
|
|
702
|
+
return [lambda x, i=i: x * i for i in range(5)]
|
|
703
|
+
|
|
704
|
+
multipliers = create_multipliers()
|
|
705
|
+
print(multipliers[0](10)) # 0
|
|
706
|
+
print(multipliers[1](10)) # 10
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
### 4. 类方法装饰器顺序
|
|
710
|
+
|
|
711
|
+
```python
|
|
712
|
+
class MyClass:
|
|
713
|
+
# ❌ 错误: @classmethod 必须在最外层
|
|
714
|
+
@decorator
|
|
715
|
+
@classmethod
|
|
716
|
+
def method(cls):
|
|
717
|
+
pass
|
|
718
|
+
|
|
719
|
+
# ✅ 正确: @classmethod 在内层
|
|
720
|
+
@classmethod
|
|
721
|
+
@decorator
|
|
722
|
+
def method(cls):
|
|
723
|
+
pass
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
## 性能考虑
|
|
727
|
+
|
|
728
|
+
### 装饰器的性能影响
|
|
729
|
+
|
|
730
|
+
```python
|
|
731
|
+
import timeit
|
|
732
|
+
from functools import wraps
|
|
733
|
+
|
|
734
|
+
# 原函数
|
|
735
|
+
def original_function(n):
|
|
736
|
+
return sum(range(n))
|
|
737
|
+
|
|
738
|
+
# 带装饰器的函数
|
|
739
|
+
def simple_decorator(func):
|
|
740
|
+
@wraps(func)
|
|
741
|
+
def wrapper(*args, **kwargs):
|
|
742
|
+
return func(*args, **kwargs)
|
|
743
|
+
return wrapper
|
|
744
|
+
|
|
745
|
+
@simple_decorator
|
|
746
|
+
def decorated_function(n):
|
|
747
|
+
return sum(range(n))
|
|
748
|
+
|
|
749
|
+
# 性能对比
|
|
750
|
+
original_time = timeit.timeit(
|
|
751
|
+
lambda: original_function(1000),
|
|
752
|
+
number=100000
|
|
753
|
+
)
|
|
754
|
+
|
|
755
|
+
decorated_time = timeit.timeit(
|
|
756
|
+
lambda: decorated_function(1000),
|
|
757
|
+
number=100000
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
print(f"Original: {original_time:.4f}s")
|
|
761
|
+
print(f"Decorated: {decorated_time:.4f}s")
|
|
762
|
+
print(f"Overhead: {(decorated_time - original_time) / original_time * 100:.2f}%")
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
**优化建议**:
|
|
766
|
+
1. 避免在装饰器中进行不必要的计算
|
|
767
|
+
2. 使用 `functools.lru_cache` 缓存装饰器结果
|
|
768
|
+
3. 对于性能关键代码,考虑内联优化而非装饰器
|
|
769
|
+
|
|
770
|
+
## 参考资料
|
|
771
|
+
|
|
772
|
+
### 官方文档
|
|
773
|
+
- [Python Decorators PEP 318](https://www.python.org/dev/peps/pep-0318/)
|
|
774
|
+
- [Python functools Module](https://docs.python.org/3/library/functools.html)
|
|
775
|
+
- [Python Descriptor Protocol](https://docs.python.org/3/howto/descriptor.html)
|
|
776
|
+
|
|
777
|
+
### 经典文章
|
|
778
|
+
- [Understanding Python Decorators](https://realpython.com/primer-on-python-decorators/)
|
|
779
|
+
- [Python Decorators: A Complete Guide](https://www.datacamp.com/tutorial/decorators-python)
|
|
780
|
+
- [Advanced Python Decorators](https://www.toptal.com/python/python-decorators)
|
|
781
|
+
|
|
782
|
+
### 书籍
|
|
783
|
+
- *Fluent Python* by Luciano Ramalho (Chapter 7: Decorators and Closures)
|
|
784
|
+
- *Python Cookbook* by David Beazley (Chapter 9: Metaprogramming)
|
|
785
|
+
- *Effective Python* by Brett Slatkin (Item 26: Use functools.wraps)
|
|
786
|
+
|
|
787
|
+
### 视频教程
|
|
788
|
+
- [Raymond Hettinger - Python's Class Development Toolkit](https://www.youtube.com/watch?v=HTLu2DFOdTg)
|
|
789
|
+
- [James Powell - Decorators: A Powerful and Useful Tool in Python](https://www.youtube.com/watch?v=4QCYT49rHvY)
|
|
790
|
+
|
|
791
|
+
---
|
|
792
|
+
|
|
793
|
+
**知识ID**: `python-decorators-complete`
|
|
794
|
+
**领域**: development
|
|
795
|
+
**类型**: standards
|
|
796
|
+
**难度**: intermediate
|
|
797
|
+
**质量分**: 92
|
|
798
|
+
**维护者**: python-team@umadev.com
|
|
799
|
+
**最后更新**: 2026-03-29
|