2014-08-28 1 views
2

나는 자주 이런 상황이 발생할 . 이 경우, 난 그냥 루프의 나머지를 건너 뛰고 난의 다음 반복으로 이동하려는, 그래서 나는 종종 이런 식으로 뭔가 쓰기 :파이썬 예외 루프에서 절을 제외하고 ... 시도와 함수

for i in range(10): 
    try: 
     os.mkdir(i) 
    except OSError: 
     continue 

그러나, 내가 정말, 정말 원하는 것은 함수입니다 그 행동을 요약합니다. 이런 식으로 뭔가 :

for i in range(10): 
    custom_mkdir(i) 

이 존재하지 않는 경우 디렉토리를 만들지 만의 다음 interation으로 건너 뜁니다하는 의도 된 행동 :이 같은 일부 코드를 가질 수 있도록

def custom_mkdir(directory): 
    try: 
     os.mkdir(directory) 
    except OSError: 
     continue 

for 루프가있는 경우.

그러나 continue 문은 이러한 방식으로 함수에 포함될 수 없습니다. 그럼 어떻게하면 의도하지 않은 동작을 얻을 수 있습니까?

for i in range(10): 
    try: 
     custom_mkdir(i) 
    except OSError: 
     continue 

이것은 처음보다 훨씬 나쁜 상황입니까?

답변

5

음, 다른 루프 내부에서 무슨 방금이 수행 할 수 custom_mkdir 아래에 실제로 더 많은 코드가 있다면

def custom_mkdir(directory): 
    try: 
     os.mkdir(directory) 
    except OSError: 
     pass 

for i in range(10): 
    custom_mkdir(i) 

을, 당신이 할 수있는 최선을 생각한다 할이 있습니다 :

def custom_mkdir(directory): 
    try: 
     os.mkdir(directory) 
     return True 
    except OSError: 
     return False 

for i in range(10): 
    if not custom_mkdir(i): 
     continue 

또는

for i in range(10): 
    if custom_mkdir(i): 
     # The rest of the logic in here 

적어도 원래보다 약간 간결합니다.

def custom_mkdir(directory): 
    try: 
     os.mkdir(directory)    
    except OSError: 
     return False 
    return True 

for i in range(10): 
    if not custom_mkdir(directory): continue 
2

OSErrorcustom_mkdir 안에 걸러 내면 의 기능은 무엇이든이 원하는 것은 아무 것도하지 않습니다. 그래서, 아무것도하지 : 아무것도 존재하지 않는 경우는

def custom_mkdir(directory): 
    try: 
     os.mkdir(directory) 
    except OSError: 
     pass 
+0

실패합니다. –

+1

@JoshSmeaton : 발신자가해야 할 일을 결정해야합니까?질문에 게시 된 코드에서는 그렇지 않습니다. – jwodder

+0

예, 발신자가 수행합니다. 그것이 문제의 핵심입니다. 'mkdir '이 실패하면 OP는'continue'를 원합니다. 그들은 루프를 더 깔끔하게 보이기 위해 try/except를 캡슐화하기를 원합니다. –

0

단지 BOOL 리턴 ([범위의 난 (10)] cusyom_mkdir)

def cusyom_mkdir(diectory): 
try: 
    os.mkdir(directory) 
    return True 
except OSError: 
    return False 

상태 = 맵

또는

def cusyom_mkdir(diectory): 
try: 
    os.mkdir(directory) 
    return True, directory 
except OSError: 
    return False, directory 

status = map (cusyom_mkdir, [나는 내가 범위 (10)에 대한])

당신은 디렉토리가 성공적으로 디렉토리 생성을 만들어 볼 수는 호출자가 비록 무엇을 결정하는 데 도움이되지 않습니다