清除 python 导入语句

Clean python import statements

我已经为 REST API 创建了一个 python 包装器。 API 有很多端点,所以我为每个端点创建了一个文件。

一般的想法是用户可以做这样的事情

from my_package import Client
from my_package.endpoints import Users

prod = Client("myhostname.com", "Username", "Password")
all_users = Users(prod).list()

我的包的文件目前结构如下

my_project/
 └-- my_package/
 |    └-- __init__.py
 |    └-- client.py
 |    └-- const.py
 |    └-- endpoints/
 |        └-- __init__.py
 |        └-- contracts.py
 |        └-- credits.py
 |        └-- payments.py
 |        └-- users.py
 └-- setup.cfg
 └-- readme.md
 └-- pyproject.toml
# my_package/__init__.py
from my_package.client import Client
# my_package/endpoints/__init__.py
from my_package.endpoints.contracts import Contracts
from my_package.endpoints.creditsimport Credits
from my_package.endpoints.paymentsimport Payments
from my_package.endpoints.usersimport Users

现在的问题是,当您导入时,通过智能感知为您提供了很多重复项。

from my_package.endpoints import contracts
                                 Contracts
                                 credits
                                 Credits
                                 payments
                                 Payments
                                 users
                                 Users

我该如何清理它?

我认为这是正确的行为。要仅将智能感知建议减少到 class 名称,您需要将模块移动到另一个包。

例如

my_project/
 └-- my_package/
      └-- __init__.py
      └-- client.py
      └-- api
      |   └-- endpoints.py
      └-- endpoints/
          └-- __init__.py
          └-- contracts.py
          └-- credits.py
          └-- payments.py
          └-- users.py
# my_package/endpoints/__init__.py
# my_package/api/endpoints.py
from my_package.endpoints.contracts import Contracts
from my_package.endpoints.creditsimport Credits
from my_package.endpoints.paymentsimport Payments
from my_package.endpoints.usersimport Users
from my_package.api.endpoints import Contracts
                                     Credits
                                     Payments
                                     Users

当然,您可以为包命名不同的名称或选择适合您需要的其他结构。例如,您可以将 contracts.py 和朋友移动到 impl 子包中,并保留 endpoints/__init__.py 文件,其中只包含稍微修改过的导入。或者您可以将 contracts.py 和朋友移动到另一个包。选项数量不限。

重点是智能感知总是建议您给定模块中的所有名称。无论它们是子模块名称、class 名称还是任何其他名称。这就是用户通常想要的,也是他们习惯的。我们通常使用文档作为在我们的库中导航用户的方式,而不是智能感知。但是如果这些建议对你来说真的很重要,你必须把名字移到模块之外。 (或者使用导入系统和 dunder 属性做一些丑陋的把戏。)