"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Python: padrões de código interessantes

Python: padrões de código interessantes

Publicado em 2024-11-08
Navegar:427

Python: Interesting Code Patterns

Eu trabalho principalmente com Python e reviso o código quase diariamente. Em nossa base de código, a formatação e o linting são gerenciados por trabalhos de CI usando black & mypy. Então, focamos apenas nas mudanças.

Ao trabalhar em equipe, você já sabe que tipo de código esperar de um determinado membro da equipe. As revisões de código tornam-se interessantes quando uma nova pessoa se junta à equipe. Digo interessante, pois todo mundo tem algum estilo de codificação que usa inconscientemente; para o bem ou para o mal! Como se eu tivesse alguns,

  1. Definindo o valor do tipo opcional. Normalmente essas variáveis ​​fazem parte da assinatura
# I used (long back) to do

def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None):

    if b is None:
       b = []
    if c is None:
       c = {}

# Instead I do

def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None):

    b = b or []
    c = c or {}
  1. Tratamento de instruções simples if..elif..else (até 3-4) com dict

Este é um caso de uso simples em que você retorna uma string ou chama uma função com base em algum valor

Nota: a partir da versão 3.10 você deve usar match em vez disso.

Em vez de fazer,

def get_number_of_wheels(vehicle: str):
    if vehicle == "car":
        wheels = 2
    elif vehicle == "bus":
        wheels = 6
    elif vehicle == "bicycle":
        wheels = 2
    else:
        raise ...

# I prefer doing, 

def get_number_of_wheels(vehicle: str):
    return {
       "car": 2,
       "bus": 6,
       "bicycle": 2
    }[vehicle]       # Raise is now KeyError

Acima estão alguns exemplos, as pessoas que revisarem meu código terão mais exemplos.

Recentemente, um novo desenvolvedor se juntou à minha equipe e notei um padrão que adorei, mas pedi para alterá-lo para um caso if..else simples. Mostrarei primeiro o padrão e depois darei meu motivo para pedir a mudança.

O código é um decorador que faz algo com os parâmetros. Vamos escrever um decorador simples (inútil) que imprimirá o número de argumentos e kwargs com os quais a função/método foi chamada.

def counter(is_cls_method: bool = False):
    """ print number of args & kwargs for func/method """
    def outer(f):
        def inner(*args, **kwargs):
            args_cnt = len(args)
            kwargs_cnt = len(kwargs)
            print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}")
            return f(*args, **kwargs)
        return inner
    return outer

@counter()
def test1(a, b, c):
    pass

class A:
    @counter(is_cls_method=True)
    def test1(self, a, b, c):
        pass


print("function")
test1(1, 2, c=3)
test1(a=1, b=2, c=3)

print("method")
a = A()
a.test1(1, 2, 3)
a.test1(1, b=2, c=3)

Ao executar este código, você deverá ver

function
test1 called with args_cnt=2 & kwargs_cnt=1
test1 called with args_cnt=0 & kwargs_cnt=3

method
test1 called with args_cnt=4 & kwargs_cnt=0
test1 called with args_cnt=2 & kwargs_cnt=2

Está funcionando bem, mas para métodos, também está contando a si mesmo. então vamos consertar isso!

def counter(is_cls_method: bool = False):
    def outer(f):
        def inner(*args, **kwargs):
            args_cnt = len(args)

            if is_cls_method:   # Check added
               args_cnt -= 1    # Reduced count by 1

            kwargs_cnt = len(kwargs)
            print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}")
            return f(*args, **kwargs)
        return inner
    return outer

Esta é uma cláusula if simples, mas o novo desenvolvedor fez outra coisa que foi interessante no uso de booleano.

Estou mostrando apenas o código alterado...

   args_cnt = len(args[is_cls_method:])

A solução é muito melhor do que usar if, já que bool em python é apenas int. O código original era um pouco mais longo e perceber essa pequena mudança não é óbvio, também a base de código usada por usuários que são usuários básicos de Python. E, se você tiver que adivinhar o que uma linha está fazendo, acho que você deveria mudar para torná-la óbvia.

Qual é a sua opinião sobre isso. Você usa booleano como índice?
Você tem mais padrões python como este?

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/ninadmhatre/python-interesting-code-patterns-dh3?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3