如何组织Python API模块使其整洁?

Ano*_*use 10 python usability readability api-design code-organization

我正在写一个表示某些Web API的Python库。现在,我的库目录看起来与此相似:

  • __init__.py
  • Account.py
  • Order.py
  • Category.py
  • requests.py

在中__init__.py,我有类似以下内容:

from .Account import Account
from .Order import Order
from .Category import Category
from . import requests
Run Code Online (Sandbox Code Playgroud)

这允许先使用import cool_site然后再cool_site.Account(…)进行诸如此类的操作,但是存在以下问题:当我在IDLE中处理代码时,该对象随后被称为cool_site.Account.Account,这感觉很不好。

1.有什么方法可以避免类名重复,并且每个类仍然有单独的文件?

接下来我感到不满意的是我的代码组织。现在,我的Account班级接受初始化凭证,创建一个requests.Session对象,然后处理与服务器的所有通信,即搜索订单等。Account然后,此类实例将自身传递给所有其他实例,例如传递给Order-,因此订单的实例将具有.account保存Account创建它的实例的属性。当另一个类实例本身必须执行某项操作时(例如,更改订单的注释)(通过调用o.comment = 'new comment',由类中的@comment.setter装饰器进行更改Order),它将其转发给一个Account对象,该对象在初始化时传递给该对象,然后使用example self.account.set_order_comment(new_comment)。然后,此方法将使用所有Web请求来实现该目标。

2.最好将服务器通信逻辑放在一个类中,或者将它的不同方面传播到受它们影响的类中?

我想问的最后一件事是如何以及在哪里保留低级请求模板。现在我在cool_site.requests子模块中有它,针对不同的请求有不同的功能,例如SetOrderComment上述情况(这是一个功能,因此应该小写,但是在这种情况下,我认为它在某种程度上类似于类-是可以吗?)。该Account.set_order_comment会使用这样的:

r = cool_site.requests.SetOrderComment(order.id, new_comment)
response = self._session.request(**r)
Run Code Online (Sandbox Code Playgroud)

因为此函数会返回一个带有参数的字典,以Session.requestrequests库中获取函数。身份验证标头已在类实例的_session属性中设置Account。我觉得这有点难看,但是我没有更好的主意。

3.如何组织网络请求以保持所有内容清洁?

投稿后

抱歉,这个问题太长了,涵盖了API库设计的许多方面,但是所有提示将不胜感激。从某种意义上说,以上三个问题都可以表述为“如何做得更好,更清洁?” 或“大多数Python开发人员是如何做到的?”,甚至“大多数Python感觉如何?”。

给我扔出您能想到的任何小窍门。

Pet*_*one 2

我可以提出一个简单的提示:您可以__all__ = ["Account"]Account.py模块中使用,然后from .Account import *__init__.py文件中使用。我相信这解决了你的第一个问题。您可以在这里阅读有关__all__魔术方法的内容。简而言之,您可以在使用时指定要导入的方法等。您可以隐藏“私有”方法,以免使用.from x import *_one_leading_underscore