@Pythonetc outubro de 2018

imagem

Esta é a quinta seleção de dicas e programação em Python do meu feed @pythonetc.

Seleções anteriores:



Separador -


Cada utilitário de linha de comando decente deve receber argumentos na forma de opções (por exemplo, -h ou --help ), opções com parâmetros ( --log-level 2 ) ou parâmetros posicionais ( cp file1 file2 ).

As opções diferem dos parâmetros posicionais pela presença de um ou dois traços no início. Quando argumentos posicionais começam com um hífen, surgem problemas: se você deseja excluir um arquivo chamado -rf , o comando rm -rf não ajudará nisso.

Uma saída fácil é usar dois traços como separador. Argumentos após - não são considerados opções:

$ echo test > -rf $ cat -rf cat: invalid option -- 'r' Try 'cat --help' for more information. $ cat -- -rf test $ rm -- -rf $ cat -- -rf cat: -rf: No such file or directory 

Dois traços são suportados pelo módulo argparse imediatamente.

Classificar estabilidade


A classificação padrão no Python é robusta, a função classificada não altera a ordem dos objetos iguais:

 In : a = [2, -1, 0, 1, -2] In : sorted(a, key=lambda x: x**2) Out: [0, -1, 1, 2, -2] 

As funções min e max também são consistentes com as ordenadas. max funciona como classificado (a, reverse = True) [0] e min funciona como classificado ( a) [0] . Isso significa que ambas as funções retornam a resposta mais à esquerda possível:

 In : max([2, -2], key=lambda x: x**2) Out: 2 In : max([-2, 2], key=lambda x: x**2) Out: -2 In : min([2, -2], key=lambda x: x**2) Out: 2 In : min([-2, 2], key=lambda x: x**2) Out: -2 

Cache no argumento padrão


Talvez o erro mais comum entre os pythonists iniciantes seja especificar um objeto mutável como argumento para a função padrão. A separação deste objeto entre chamadas de função pode levar a resultados mais estranhos:

 def append_length(lst=[]): lst.append(len(lst)) return lst print(append_length([1, 2])) # [1, 2, 2] print(append_length()) # [0] print(append_length()) # [0, 1] 

No entanto, esse compartilhamento será útil se você usar o objeto para criar um cache compartilhado:

 def fact(x, cache={0: 1}): if x not in cache: cache[x] = x * fact(x - 1) return cache[x] print(fact(5)) 

Neste exemplo, colocamos os valores fatoriais calculados dentro dos valores padrão do argumento. Esses valores podem até ser extraídos:

 >>> fact.__defaults__ ({0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120},) 

Trabalhar com FS


Você pode trabalhar com os caminhos do sistema de arquivos usando o módulo os.path . O módulo contém muitas funções que tratam as strings como caminhos de arquivo e executam várias operações úteis, como concatenação:

 >>> import os.path >>> os.path.join('/usr', 'local') '/usr/local' >>> os.path.dirname('/var/log') '/var' 

A partir da versão 3.4, o Python inclui um módulo pathlib que oferece uma abordagem orientada a objetos:

 >>> from pathlib import Path >>> Path('/usr') / Path('local') PosixPath('/usr/local') >>> Path('/usr') / 'local' PosixPath('/usr/local') >>> Path('/var/log').parent PosixPath('/var') >>> Path('/var/log').parent.name 'var' 

Objetos chamados


No Python, você pode criar um objeto que pode ser chamado, não apenas criando funções (usando a sintaxe def ou lambda ). Um objeto pode ser chamado se tiver um método __call__ :

 class Truncater: def __init__(self, length): self._length = length def __call__(self, s): return s[0:self._length] print(Truncater(4)('abcdabcd')) # abcd 

Como o decorador é essencialmente uma função de ordem superior, ele também pode ser expresso pelo objeto chamado, não uma função:

 class cached: def __init__(self, func): self._func = func self._cache = {} def __call__(self, arg): if arg not in self._cache: self._cache[arg] = self._func(arg) return self._cache[arg] @cached def sqr(x): return x * x 

Source: https://habr.com/ru/post/pt429186/


All Articles