Se é absolutamente necessário, é a pergunta errada a ser feita. A questão é se é uma boa ideia.
Como regra na programação, você deve evitar fazer coisas estranhas e usar a melhor ferramenta para o trabalho . Se algo tiver uma maneira explícita de liberar recursos, apenas torne a versão explícita e pronto:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
O que você pode não estar ciente é que a with
cláusula realmente chama lógica adicional. Uma with
cláusula requer um gerenciador de contexto, que deve ter um método __enter__
(chamado quando o bloco é inserido) e __exit__
(chamado quando o bloco é encerrado). Em particular, o __exit__
método é chamado independentemente da ocorrência de uma exceção, garantindo que o programa sempre libere o recurso mesmo com erro. Isso fornece ao seu código uma documentação explícita de quando um recurso é adquirido e quando é lançado, além de garantir que um recurso possa ser liberado o mais rápido possível.
Por outro lado, você não pode realmente depender do tempo de execução para fechá-lo magicamente imediatamente para você. Isso ocorre porque a maneira como ele é fechado é invocando o destruidor do objeto, o que pode ou não acontecer imediatamente. O Python não oferece nenhuma garantia sobre quando um destruidor é chamado, apenas que será eventualmente quando o objeto for coletado de lixo. (Veja aqui .) Atualmente, o Python é implementado para que ocorra assim que não houver mais uma referência a um objeto. Mas é fácil propagar acidentalmente referências a um objeto, e o tempo de execução do Python pode mudar.
Considere também a manutenção a longo prazo. Não há nenhuma referência a longo prazo para isso agora, mas o que acontece em 6 meses quando você precisa modificar o código de modo que não é uma referência? E se alguém fizer isso? A pessoa que está fazendo a alteração pode não pensar em mudar para um with
bloco, já que ainda não existe um. Crie um hábito de limpar seus recursos e você terá muito menos problemas com ele.
Deseja realmente vincular seu código aos detalhes de implementação da coleta de lixo? Deseja ter que pensar constantemente se você pode estar propagando acidentalmente uma referência por uma exceção? Não você não. Imagine se isso aconteceu quando o script foi chamado no ArcMap. O usuário seria forçado a fechar todo o processo apenas para liberar o arquivo. Portanto, não se coloque nessa posição. Libere o recurso explicitamente. Salvar uma linha de código não vale os riscos de problemas que ela pode causar. Os gerenciadores de contexto são o mecanismo padrão para adquirir e liberar recursos no Python, e eles fazem isso muito bem.
O ponto principal é que não divulgá-lo explicitamente é uma má ideia.
Isso, é claro, pressupõe que o código tenha alguma possibilidade de afetar outra pessoa, como colocá-lo em um script que outra pessoa precisará executar ou manter ou pode atrasar a entrega do seu trabalho se você precisar fechar o ArcMap até o fim, porque você não pode salvar suas alterações. Se você é o único que será impactado por um problema, então, por todos os meios, enfrente as boas práticas o quanto quiser.
da
cursores: sgillies.net/2011/02/01/01/get-with-it.html e help.arcgis.com/ pt-br / arcgisdesktop / 10.0 / help / index.html # //… . Em particular, veja os comentários de @JasonScheirer na parte inferior do primeiro link.