O que se entende por "usar o princípio EAFP" em Python? Você poderia fornecer alguns exemplos?
O que se entende por "usar o princípio EAFP" em Python? Você poderia fornecer alguns exemplos?
Respostas:
No glossário :
Mais fácil pedir perdão do que permissão. Esse estilo comum de codificação Python pressupõe a existência de chaves ou atributos válidos e captura exceções se a suposição for falsa. Este estilo limpo e rápido é caracterizado pela presença de muitos
try
eexcept
declarações. A técnica contrasta com o estilo LBYL comum a muitos outros idiomas, como C.
Um exemplo seria uma tentativa de acessar uma chave de dicionário.
EAFP:
try:
x = my_dict["key"]
except KeyError:
# handle missing key
LBYL:
if "key" in my_dict:
x = my_dict["key"]
else:
# handle missing key
A versão LBYL deve procurar a chave dentro do dicionário duas vezes e também pode ser considerada um pouco menos legível.
x
quando a chave não existe: x = mydict.get('key')
retornará None
se 'key'
não estiver my_dict
; você também pode fazer .get('key', <something>)
e, em seguida, x será atribuído a algo assim se a chave não estiver no dicionário. dict.setdefault()
e collections.defaultdict
são boas coisas para evitar o excesso de código também.
except KeyError
que AttributeError
são simples, mas são alguns dos piores exemplos. Muitas vezes eu estava preso a depurar alguma coisa porque except AttributeError
foi colocado no lugar errado, o que acabou pegando um erro de atributo errado gerado mais profundamente na cadeia. Melhores exemplos que eu acho que são: try: open() ... except: IOError
. Outry: parseLine() ... except ParseError
Vou tentar explicar com outro exemplo.
Aqui estamos tentando acessar o arquivo e imprimir o conteúdo no console.
Podemos querer verificar se podemos acessar o arquivo e, se pudermos, abriremos e imprimiremos o conteúdo. Se não pudermos acessar o arquivo, acessaremos a else
parte. A razão pela qual essa é uma condição de corrida é porque primeiro fazemos uma verificação de acesso. Quando chegamos, with open(my_file) as f:
talvez não possamos mais acessá-lo devido a alguns problemas de permissão (por exemplo, outro processo ganha um bloqueio exclusivo de arquivo). Esse código provavelmente causará um erro e não poderemos capturá-lo porque pensamos que poderíamos acessar o arquivo.
import os
my_file = "/path/to/my/file.txt"
# Race condition
if os.access(my_file, os.R_OK):
with open(my_file) as f:
print(f.read())
else:
print("File can't be accessed")
Neste exemplo, estamos apenas tentando abrir o arquivo e, se não podemos abri-lo, lançará um IOError
. Se pudermos, abriremos o arquivo e imprimiremos o conteúdo. Então, em vez de perguntar algo, estamos tentando fazer isso. Se funcionar, ótimo! Caso contrário, capturamos o erro e o tratamos.
# # No race condition
try:
f = open(my_file)
except IOError as e:
print("File can't be accessed")
else:
with f:
print(f.read())
Eu chamo de "programação otimista". A ideia é que na maioria das vezes as pessoas façam a coisa certa, e os erros devem ser poucos. Portanto, primeiro codifique para que a "coisa certa" aconteça e, em seguida, identifique os erros, caso contrário.
Meu sentimento é que, se um usuário cometer erros, ele deve sofrer as conseqüências do tempo. As pessoas que usam a ferramenta da maneira certa são aceleradas.