Pular para o conteúdo
Skillpedia
Código em geral280 mil · #103

python-patterns

Ajuda seu agente a escrever código Python seguindo as melhores práticas. Ele garante que o código seja claro, eficiente e fácil de manter, usando padrões e dicas de estilo.

O que ela faz

Este guia ensina como escrever código Python de forma clara, eficiente e fácil de entender, seguindo as melhores práticas. Ele cobre como organizar o código, usar dicas de tipo para clareza e lidar com erros de forma inteligente.

Quando usar

  • ✓Ao escrever um novo código Python.
  • ✓Ao revisar o código de outra pessoa.
  • ✓Ao tentar melhorar um código existente.

Exemplo do que pedir para a IA

“Como posso escrever uma função em Python que seja fácil de ler e que retorne apenas os usuários ativos de uma lista?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/python-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/python-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele mostra exemplos de código bom e ruim para ilustrar os princípios. Ele explica o uso de 'type hints' para indicar os tipos de dados esperados e como usar 'context managers' para gerenciar recursos como arquivos.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill python-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/python-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Desenvolvimento Python

Padrões idiomáticos do Python e melhores práticas para construir aplicações robustas, eficientes e fáceis de manter.

Quando Ativar

  • Escrevendo código Python novo
  • Revisando código Python
  • Refatorando código Python existente
  • Projetando pacotes/módulos Python

Princípios Fundamentais

1. Legibilidade Importa

Python prioriza a legibilidade. O código deve ser óbvio e fácil de entender.

# Good: Clear and readable
def get_active_users(users: list[User]) -> list[User]:
    """Return only active users from the provided list."""
    return [user for user in users if user.is_active]


# Bad: Clever but confusing
def get_active_users(u):
    return [x for x in u if x.a]

2. Explícito é Melhor que Implícito

Evite "mágica"; seja claro sobre o que seu código faz.

# Good: Explicit configuration
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# Bad: Hidden side effects
import some_module
some_module.setup()  # What does this do?

3. EAFP - É Mais Fácil Pedir Perdão do que Permissão

Python prefere tratamento de exceções em vez de verificar condições.

# Good: EAFP style
def get_value(dictionary: dict, key: str, default_value: Any = None) -> Any:
    try:
        return dictionary[key]
    except KeyError:
        return default_value

# Bad: LBYL (Look Before You Leap) style
def get_value(dictionary: dict, key: str, default_value: Any = None) -> Any:
    if key in dictionary:
        return dictionary[key]
    else:
        return default_value

Dicas de Tipo (Type Hints)

Anotações de Tipo Básicas

from typing import Optional, List, Dict, Any

def process_user(
    user_id: str,
    data: Dict[str, Any],
    active: bool = True
) -> Optional[User]:
    """Process a user and return the updated User or None."""
    if not active:
        return None
    return User(user_id, data)

Dicas de Tipo Modernas (Python 3.9+)

# Python 3.9+ - Use built-in types
def process_items(items: list[str]) -> dict[str, int]:
    return {item: len(item) for item in items}

# Python 3.8 and earlier - Use typing module
from typing import List, Dict

def process_items(items: List[str]) -> Dict[str, int]:
    return {item: len(item) for item in items}

Aliases de Tipo e TypeVar

from typing import TypeVar, Union

# Type alias for complex types
JSON = Union[dict[str, Any], list[Any], str, int, float, bool, None]

def parse_json(data: str) -> JSON:
    return json.loads(data)

# Generic types
T = TypeVar('T')

def first(items: list[T]) -> T | None:
    """Return the first item or None if list is empty."""
    return items[0] if items else None

Duck Typing Baseado em Protocolos

from typing import Protocol

class Renderable(Protocol):
    def render(self) -> str:
        """Render the object to a string."""

def render_all(items: list[Renderable]) -> str:
    """Render all items that implement the Renderable protocol."""
    return "\n".join(item.render() for item in items)

Padrões de Tratamento de Erros

Tratamento Específico de Exceções

# Good: Catch specific exceptions
def load_config(path: str) -> Config:
    try:
        with open(path) as f:
            return Config.from_json(f.read())
    except FileNotFoundError as e:
        raise ConfigError(f"Config file not found: {path}") from e
    except json.JSONDecodeError as e:
        raise ConfigError(f"Invalid JSON in config: {path}") from e

# Bad: Bare except
def load_config(path: str) -> Config:
    try:
        with open(path) as f:
            return Config.from_json(f.read())
    except:
        return None  # Silent failure!

Encadeamento de Exceções

def process_data(data: str) -> Result:
    try:
        parsed = json.loads(data)
    except json.JSONDecodeError as e:
        # Chain exceptions to preserve the traceback
        raise ValueError(f"Failed to parse data: {data}") from e

Hierarquia de Exceções Personalizadas

class AppError(Exception):
    """Base exception for all application errors."""
    pass

class ValidationError(AppError):
    """Raised when input validation fails."""
    pass

class NotFoundError(AppError):
    """Raised when a requested resource is not found."""
    pass

# Usage
def get_user(user_id: str) -> User:
    user = db.find_user(user_id)
    if not user:
        raise NotFoundError(f"User not found: {user_id}")
    return user

Gerenciadores de Contexto

…

Perguntas frequentes

O que são 'type hints'?

'Type hints' são como anotações no código que dizem qual tipo de informação uma variável ou função espera (ex: texto, número) e qual tipo ela retorna. Isso ajuda a evitar erros e torna o código mais fácil de entender.

O que significa 'EAFP'?

'EAFP' significa 'É mais fácil pedir perdão do que permissão'. Em programação, isso quer dizer que é melhor tentar fazer algo e lidar com um erro se ele acontecer, em vez de verificar todas as condições possíveis antes de tentar.

O que são 'context managers'?

'Context managers' são ferramentas que ajudam a gerenciar recursos, como abrir e fechar arquivos automaticamente. Eles garantem que os recursos sejam liberados corretamente, mesmo que ocorram erros.

Detalhes

Descrição original do autor

Pythonic idioms, PEP 8 standards, type hints, and best practices for building robust, efficient, and maintainable Python applications. Use when writing or reviewing Python code and idiomatic structure, typing, or PEP 8 is in question.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#103
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas