É esta a maneira certa de usar a instrução python "with" em combinação com um bloco try-except ?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Se for, considerando a velha maneira de fazer as coisas:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
O principal benefício da instrução "with" aqui é que podemos nos livrar de três linhas de código? Não me parece muito atraente para este caso de uso (embora eu entenda que a instrução "com" tenha outros usos).
EDIT: A funcionalidade dos dois blocos de código acima é idêntica?
EDIT2: As primeiras respostas falam geralmente sobre os benefícios de usar "com", mas parecem ter um benefício marginal aqui. Todos nós temos (ou deveríamos ter chamado) explicitamente f.close () por anos. Suponho que um dos benefícios é que programadores desleixados se beneficiarão com o uso de "com".
Respostas:
finally
cláusula porquef
não está vinculado.O código de estilo antigo equivalente seria:
Como você pode ver, a
with
declaração pode tornar as coisas menos sujeitas a erros. Nas versões mais recentes do Python (2.7, 3.1), você também pode combinar várias expressões em umawith
instrução. Por exemplo:Além disso, pessoalmente considero um mau hábito detectar qualquer exceção o mais cedo possível. Este não é o objetivo das exceções. Se a função IO que pode falhar é parte de uma operação mais complicada, na maioria dos casos o IOError deve abortar toda a operação e, portanto, ser tratado em um nível externo. Usando
with
declarações, você pode se livrar de todas essastry...finally
declarações em níveis internos.fonte
Se o conteúdo do
finally
bloco é determinado pelas propriedades do objeto de arquivo que está sendo aberto, por que não deveria o implementador do objeto de arquivo ser o único a escrever ofinally
bloco? Esse é o benefício dawith
instrução, muito mais do que economizar três linhas de código nesta instância específica.E sim, a maneira que você combinado
with
etry-except
é praticamente a única maneira de fazê-lo, como erros excepcionais causado dentro daopen
declaração em si não pode ser capturado dentro dowith
bloco.fonte
Acho que você se enganou sobre a afirmação "com" de que ela apenas reduz as linhas. Na verdade, ele faz a inicialização e controla a desmontagem.
No seu caso, "com" significa
Aqui está um link para entender a declaração "com": http://effbot.org/zone/python-with-statement.htm
Editar: Sim, seu uso de "com" está correto e a funcionalidade de ambos os blocos de código é idêntica. Pergunta sobre por que usar "com"? é por causa dos benefícios que você obtém com isso. como você mencionou sobre a falta acidental de f.close ().
fonte
A maneira mais pitônica para os seguintes códigos é:
fonte
readline()
chamada ausente , sua versão não fecha o arquivo se oreadline()
resultado for umIOError
.