3

저는 Python 기반 API의 디자인 작업을하고 있습니다. 지금은 두 가지 다른 요구 사항을 가진 문제를 만났습니다. 한편으로는 API 관련 리소스를 정리하는 안정적인 방법을 제공하고자합니다. 내가 완벽하게 대화 형 인터프리터 내 lib 디렉토리를 사용하는 방법을 제공하고자하는 반면에python api를 디자인하는 중입니다. 신뢰할 수있는 정리 대 인터프리터에서 사용하기 편리합니다.

# lib 

class Client(object): 
    def __enter__(self): 
    return self 

    def __exit__(self, exc_type, exc_val, tb): 
    do_cleanup() 

    def method1(self): 
    pass 

    def method2(self): 
    pass 

# api user 
import mylib 

with mylib.Client() as client: 
    client.method1() 
    client.method2() 

: 내가 할 수있는 최선의 방법을 알고 이에로는 같은 맥락 관리자를 사용하는 것입니다. with 또는 try-except-finally과 같은 복합 구조체를 인터프리터에 사용하면 with -block이 단일 명령문으로 처리되기 때문에 인터프리터를 사용하지 않게됩니다. 내가 여기있는 옵션을 가질 수있다, 그래서

# interpreter session 

>>> import mylib 
>>> client = mylib.Client() 
<client object at ...> 
>>> client.method1() 
True 
>>> client.method2() 
100 

: 그리고 같은 하나의 API 메소드 당 하나의 문을 사용하는 것이 바람직 할 것이다이야? 확실히 스크립트와 인터프리터에 다른 사용법을 제공하는 방법이 있지만 최후의 수단으로 사용하고 싶습니다.

+3

왜'open'이하는 것처럼 할; 컨텍스트 관리자를 사용하거나 명시 적으로'close' (이것은'__exit__'에 대한 호출로 쉽게 구현할 수 있습니다)를 사용할 수 있습니다. – jonrsharpe

답변

2

이 작업을 수행하는 일반적인 방법은 수동으로 정리를 수행하고 __exit__ 메서드를 호출하는 방법을 제공하는 것입니다. 예를 들어 do_cleanup이 메소드로 구현 된 경우이를 완료하면 인터프리터에서 호출 할 수 있습니다.

class Client(object): 
    def __enter__(self): 
    return self 

    def __exit__(self, exc_type, exc_val, tb): 
    self.do_cleanup() 

    def do_cleanup(self): 
    pass 

    def method1(self): 
    pass 

    def method2(self): 
    pass 

그런 다음 인터프리터 :

>>> import mylib 
>>> client = mylib.Client() 
<client object at ...> 
>>> client.method1() 
True 
>>> client.method2() 
100 
>>> client.do_cleanup() 

나는 File Objects 사이의 유사성이 더 분명되도록, close 또는 유사한로 do_cleanup 이름을 바꾸는 것이 좋습니다.

0

당신은 구현 모듈, openclose 기능, 당신의 '기본'논리를 만들고, 컨텍스트 매니저와이 클래스를 확장 할 수 :

#in private module mymodule.impl 
class Base(object): 
    def open(self, ...): 
     ... 
    def close(self): 
     ... 

이 파일은 일반적으로 클라이언트가 포함되지 않을 것 암호.

대신, 다음과 같습니다 클라이언트 코드 수입 exported.api :

#in public package mymodule 
import mymodule.impl 

class Base(mymodule.impl.Base): 
    def __enter__(self): 
     return self 
    def __exit__(self, ...): 
     self.close()