2016-09-27 2 views
1

imaplib 라이브러리를 사용하여 IMAP 서버의 일부 데이터를 요청하는 스크립트를 작성하고 있습니다. 연결 (c), 나는 다음과 통화를 할을 시작한 데 :개별 함수 호출을 파이썬으로 둘러보기

rv, data = c.login(EMAIL_ACCOUNT, EMAIL_PASS) 
if rv != 'OK': 
    print('login error') 
else: 
    print(rv, data) 

rv, mailboxes = c.list() 
if rv != 'OK': 
    print('mailbox error') 
else: 
    print(rv, data) 

rv, data = c.select(EMAIL_FOLDER) 
if rv != 'OK': 
    print('folder error') 
else: 
    print(rv, data) 

어떻게 오류 코드를 확인하고 데이터를 인쇄하는 로직을 재사용 할 수 래퍼 함수의 일종을 사용하려면이를 다시 작성할 수 있을까? 나는 함수가 인수로서 오류 메시지를 취할 것이며 실행 명령 (select, login, 등)이 있다고 가정합니다. 인수에 인수의 이름을 전달하여 선택 연결 함수를 호출하려면 어떻게해야합니까?

+0

당신이 무엇을 요구하는지 명확하지 않습니다. 예, 래퍼 함수 ('rv, data = handle_error (c.login (...))')를 작성하거나 메소드 이름에 다른 함수를 전달할 수 있습니다. 무엇을 시도 했습니까? 문제는 무엇입니까? – jonrsharpe

+0

'def check (rv, data, msg) : ...'그리고'check (rv, data, 'folder error')'로 사용 하시겠습니까? – Bakuriu

+0

@jonrsharpe 기본적으로,이 작업을 (select, list, login) 조치와 함께 오류 메시지와 함께 인수로 사용하는 단일 함수로 단순화하려고합니다. "handle"함수에 인수로 함수 호출 (예 :'c.list()')을 전달할 수 있습니까? – mart1n

답변

1

는 동일하게 유지하는 일을보고, 어떤 코드를 다시 사용하려면 (rvdata 그 순서대로 imaplib 전화에서 나오는 것을 예를 들면 사실을, 그리고 rv=='OK' 상황이 OK입니다 의미)와 로직을 작성하는 한 번 그들을 포함한다. 그런 다음 변경되는 사항을 확인하십시오 (예 : 정확한 오류 메시지를 인쇄해야 함). description 인수 오류 메시지가 변경이 예에서와 같이 변경 물건을 매개 변수화 : 나는 당신이 당신의 작업에 장식을 확인하고 싶은 이해

def check(description, rvdata): 
    rv, data = rvdata 
    if rv == 'OK': 
     print(data) 
     return data 
    else: 
     print(description + ' error') 
     return None 

data = check('login', c.login(EMAIL_ACCOUNT, EMAIL_PASS)) 
mailboxes = check('mailbox', c.list()) 
selection = check('folder', c.select(EMAIL_FOLDER)) 
+0

매우 유용합니다. 고마워요! – mart1n

2

방법.

class Wrapper: 
    def __init__(self, error_message): 
     self.error_message = error_message 

    def __call__(self, wrapped): 
     def func(*args, **kwargs): 
      rv, data = wrapped(*args, **kwargs) 
      if rv=="OK": 
       return(rv, data) 
      else: 
       print(self.error_message) 
       return(rv, data) 
     return func 

@Wrapper("Folder Error") 
def select(email_folder): 
    return "OK", "OLOLO" 

@Wrapper("Folder Error") 
def select_err(email_folder): 
    return "FAIL", "OLOLO" 

print select("") 
print select_err("") 

당신은 래퍼의 __call__ 기능의 내부에 회신을 확인하고 당신이 원하는 방식으로 처리 할 수 ​​

('OK', 'OLOLO') 
Folder Error 
('FAIL', 'OLOLO') 

를 얻을 수 있습니다. 예를 들어, rv이 "OK"가 아닌 경우 "거짓"을 반환하거나 오류를 제기 할 수 있습니다.

그러나이 경우 지나치게 복잡 할 수 있습니다.

+0

예, 조금 복잡합니다. 그럼에도 불구하고 대안적인 접근에 감사드립니다! – mart1n

+0

전에는 객체 인스턴스를 데코레이터로 사용하는 것을 생각 해보지 않았습니다. 그건 아주 멋진 트릭입니다. – jez

+0

@jez, 처음에는 데코레이터를 이해하는 데 어려움을 겪었고 최근에는 마침내 그것을 사용하는 방법을 깨달았습니다. 나는이 트릭을 어딘가에 보았다) –

관련 문제