在Python中,成语"来自Module import ClassName"是典型的吗?

Phi*_*oin 3 python import

由于我更喜欢​​小文件,我通常会为每个Python模块放置一个"公共"类.我将模块命名为与其包含的类相同的名称.因此,例如,ToolSet将在中定义类ToolSet.py.

在一个包中,如果另一个模块需要实例化ToolSet类的对象,我使用:

from ToolSet import ToolSet
...
toolSet = ToolSet()
Run Code Online (Sandbox Code Playgroud)

代替:

import ToolSet
...
toolSet = ToolSet.ToolSet()
Run Code Online (Sandbox Code Playgroud)

我这样做是为了减少"口吃"(我更喜欢在文件顶部比在我的代码中口吃.)

这是一个正确的习语吗?

这是一个相关的问题.在一个软件包中,我经常会有一些我希望向外界展示的课程.这些我在__init__.pyfor package中导入.例如,如果ToolSet在包中UI并且我想要公开它,我会将以下内容放入UI/__init__.py:

from ToolSet import ToolSet
Run Code Online (Sandbox Code Playgroud)

所以,从外部模块我可以写

import UI
...
toolSet = UI.ToolSet()
Run Code Online (Sandbox Code Playgroud)

再次,这是pythonic?

Nic*_*ood 5

为了回答你的第一个问题,这就是我使用的习语,它的使用得到了PEP8 python样式指南的支持

可以这样说:

来自子进程导入Popen,PIPE

我喜欢它,因为它减少了键入并确保文件运行时出现问题(比如你错误拼写导入),而不是一段时间后运行使用导入的函数.

例如,假设模块Thing没有Thyng成员

from Thing import Thyng
Run Code Online (Sandbox Code Playgroud)

你运行.py文件后立即出错,而

import Thing
# ...
def fn():
    Thing.Thyng()
Run Code Online (Sandbox Code Playgroud)

在你跑步之前不会出错 fn()

至于你的第二个问题,我认为这也是一个很好的做法.当我将一个large.py计入带有__init__.py和实现文件的目录时,经常会发生这种情况.将内容导入到__init__.py保持界面相同.这也是标准库中的常见做法.