![](/img/trans.png)
[英]Is there any good and easy-to-use module built in Python for editing memory?
[英]designing python api. reliable cleanup vs easy-to-use in interpreter
我正在研究基於python的API的設計。 目前我遇到了兩個不同要求的問題。 一方面,我想提供清理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()
另一方面,我想提供一種在交互式解釋器中無縫使用我的lib的方法。 以化合物構造像with
或try-except-finally
在解釋使解釋的使用不是那么時髦,因為with
-塊作為一個單獨的語句處理。 並且最好每個單獨的api方法使用單個語句,如:
# interpreter session
>>> import mylib
>>> client = mylib.Client()
<client object at ...>
>>> client.method1()
True
>>> client.method2()
100
那么,我可以在這里有任何選擇嗎? 絕對有一種方法可以為腳本和解釋器提供不同的使用語義,但我想將它作為最后的手段。
執行此操作的典型方法是提供手動執行清理的方法,並使用__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()
我建議將do_cleanup
重命名為close
或類似,以便File Objects之間的相似性更加明顯。
您可以在實現模塊中使用open
和close
函數創建“基礎”邏輯,並使用上下文管理器擴展這些類:
#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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.