簡體   English   中英

設計python api。 可靠的清理與易於使用的翻譯

[英]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的方法。 以化合物構造像withtry-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之間的相似性更加明顯。

您可以在實現模塊中使用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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM