3 回答
TA贡献1848条经验 获得超2个赞
我可以提出一个简单的提示:您可以__all__ = ["Account"]
在Account.py
模块中使用,然后from .Account import *
在__init__.py
文件中使用。我相信这解决了你的第一个问题。你可以在这里阅读__all__
魔术方法。简而言之,您可以指定使用时要导入的方法等。您可以隐藏“私有”方法以防止使用.from x import *
_one_leading_underscore
TA贡献1784条经验 获得超8个赞
我最近一直在考虑非常相似的事情wistiapy
。我目前对客户端代码组织的思考的例子就在里面。YMMV。
“每个文件一个类”比 Python 更像是一种 Java 风格指南。Python 模块是代码层次结构中合法且重要的级别,您不必担心同一模块中有多个函数或类。您可以将所有模型类放在一个
.models
模块中,然后from .models import (Account, Order, Category)
在__init__.py
.客户端库的或多或少的常见做法似乎是有一个
client
模块,包含类似MyServiceClient
类的东西。(例如Segment 客户端)。这就是网络逻辑的所在。如果您想让公共接口成为模块级函数,您可以通过创建默认客户端并让函数调用其方法来做一些聪明的事情。
函数应该是snake_case
,类应该是PascalCase
。做任何其他事情往往会导致更多的混乱而不是好处。
您正在处理的一个大问题似乎是试图在“Active Record”模式(some_account.set_order_comment(comment)
)和“Data Mapper”模式(set_order_comment(account, comment)
)之间进行选择。两者都可以,它们各有优缺点。我发现数据映射器模式——使用智能函数来操作相当简单的数据类——更容易开始。
我发现同时设计公共接口和使用该接口的东西很有帮助。在调用代码中,您可以编写您想调用的内容,然后“由外向内”实现客户端代码。
TA贡献1868条经验 获得超4个赞
1).py 文件的名称中没有大写(也尽量避免_)所以你的文件应该是
__init__.py
account.py
order.py
category.py
requests.py
2)如果你想使用cool_site.Account你需要添加到__init__.py
from .account import Account
from .order import Order
from .category import Category
__all__ = [
'Account',
'Order',
'Category',
]
3)SetOrderComment是坏名声,使用set_order_comment
4)如果您编写一个用于与 API 通信的 python 包装器,请创建在每个 API 请求中执行授权和其他相同内容的方法。此方法应将请求 kwargs 的一部分作为参数,这些 kwargs 对于不同的 API 调用是不同的
例如
class API:
def __init__(self, endpoint:s str, api_key: str):
self.endpoint = endpoint
self.api_key = api_key
def _get_auth_headers(self) -> Dict[str, str]:
return {
'Authorization': 'Bearer ' + self.api_key,
}
def get(self, path, params)
resp = requester.get(
self.endpoint + path,
headers=self._get_auth_headers(),
params=params,
timeout=30,
)
self._check_api_response(resp)
payload = resp.json()
return payload
5) 如果您编写 python API,请查看flask 和 django 框架以及带有 API 编写的项目。你应该在那里找到一些好主意。
添加回答
举报