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,
# 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 {}
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.
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?
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