我正在设计基于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
这样的复合结构使得解释器的使用不那么groovy,因为with
-块被视为单个语句。最好每个api方法使用一条语句,如:
# interpreter session
>>> import mylib
>>> client = mylib.Client()
<client object at ...>
>>> client.method1()
True
>>> client.method2()
100
那么,我有什么选择吗?当然,有一种方法可以为脚本和解释器提供不同的使用语义,但我想把它作为最后的手段。你知道吗
典型的方法是提供一个手动清理的方法,并让
__exit__
调用该方法。对于您的示例,如果do_cleanup
是作为一个方法实现的,那么在处理完它之后就可以从解释器调用它。你知道吗然后,在解释器中:
我建议将
do_cleanup
重命名为close
或类似名称,以便File Objects之间的相似性更为明显。你知道吗您可以在实现模块中使用
open
和close
函数创建“基本”逻辑,并使用上下文管理器扩展这些类:客户端代码通常不包含此文件。你知道吗
相反,客户端代码导入
exported.api
,如下所示:相关问题 更多 >
编程相关推荐