2017-05-05 2 views
3

파일을 복사하는 두 가지 방법이 있습니다. 가장 파이썬 적이거나 최상의 버전입니까?파일 복사시 try/except 또는 if/else 사용

객체 지향 교과서를 통해 나는 '예외 상황'이 발생했을 때이를 검사하고 처리하는 것을 피하는 것이 가장 바람직하다고 말했습니다. 두 번째 버전에 try/except을 사용한 방법이 유효합니까?

if/else를 사용하여 첫 번째 버전 : 확실히

try: 
    shutil.copy(self.back_zipfile_name, dest) 
except FileNotFoundError: 
    print("{!r} could not be found".format(dest)) 
+1

두 번째. 첫 번째 경쟁 조건이 있습니다. –

답변

2

제 :

if os.path.exists(dest): 
    print("\nCopying zipfile to {}".format(dest)) 
    shutil.copy(self.backup_zipfile_name, dest) 
else: 
    print("Cannot find {}.".format(dest)) 

둘째 try/except 버전을 사용.

프로그램 단계는 순차적 인 작업으로 생각할 수 있습니다. 그러나 실제로 컴퓨터 (적어도 현대적인 비 내장형 컴퓨터)가 어떻게 작동하는지는 아닙니다.

경로가 존재한다는 것을 확인하고 실제로 다른 프로그램에 손쉽게 쓰기를 시도하는 중에 catch되지 않은 런타임 예외가 발생하여이를 쉽게 삭제할 수 있습니다. 이는 일반적인 동시성 버그입니다.

파일 시스템, 네트워크 또는 완전히 제어하지 않는 기타 외부 리소스로 작업 할 때는 항상 try/catch (또는 파이썬의 경우 try/except)을 사용하십시오.

Here은 더 자세한 설명이 포함 된 훌륭한 자료입니다.

2

편집 : @Jared Smiths의 응답은 특정 사용 사례 (파일 시스템 액세스)에 더 적합하다고 생각합니다.


모든 사람이 말했듯이 그것은 당신에게 달렸지 만, 여기에 파이썬 문서에 언급 된 내용이 있습니다. 당신이 도약하기 전에

LBYL

봐. 이 코딩 스타일은 호출 또는 조회를하기 전에 사전 조건을 명시 적으로 테스트합니다. 이 양식은 EAFP 접근법과 대조되며 많은 if 문이 있다는 특징이 있습니다.

멀티 스레드 환경에서 LBYL 방식은 "보는 것"과 "뛰어 넘는 것"간에 경쟁 조건을 도입 할 위험이 있습니다. 예를 들어, 매핑의 key : return mapping [key] 코드는 다른 스레드가 테스트 후 매핑을 검색하기 전과 비교할 때 실패 할 수 있습니다. 이 문제는 잠금 또는 EAFP 접근법을 사용하여 해결할 수 있습니다.

EAFP

허락보다 용서를 물어 쉽게. 이 일반적인 파이썬 코딩 스타일은 가정이 잘못된 것으로 판명 될 경우 유효한 키 또는 속성의 존재를 가정하고 예외를 포착합니다. 이 깨끗하고 빠른 스타일은 많은 try 및 except 문이 있음을 특징으로합니다. 이 기법은 C.와 같은 다른 많은 언어에서 일반적인 LBYL 스타일과 대조됩니다.

https://docs.python.org/2/glossary.html

+2

경쟁 조건은 멀티 스레딩을 필요로하지 않음에 유의하십시오. 다른 프로그램은 단일 스레드 순차 코드의 중간에 파일 시스템을 조작 할 수 있습니다. 아니면 운전수가 추락 할 수 있습니다. 또는 여섯 가지 다른 것들 중 하나가 잘못 될 수 있습니다. –

+0

@ JaredSmith,'if os.path.exists (dest)'를 체크합니다. 그러나이 기회는 2 줄의 코드 실행 사이의 시간에 불과합니다. – itzMEonTV

+2

@ L_S로 충분합니다. 이 두 단계 사이에 몇 개의 CPU 사이클이 발생합니까? 파이썬 인터프리터가 코드를 컴퓨터 언어로 변환하여 컴퓨터가 실행되도록합니다. OS 스케줄러 (각기 다른 플랫폼에 대한)가 CPU 시간을 어떻게 실행하는지 자세히 알 수 있습니까? 저를 믿으십시오, 무언가가 잘못 될 시간이 많습니다. 이것은 모든 언어에서 일반적인 안티 패턴입니다 (파이썬뿐만 아니라). –