【问题标题】:In Python, is the idiom "from Module import ClassName" typical?在 Python 中,成语“from Module import ClassName”是典型的吗?
【发布时间】:2009-12-02 18:52:37
【问题描述】:

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

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

from ToolSet import ToolSet
...
toolSet = ToolSet()

代替:

import ToolSet
...
toolSet = ToolSet.ToolSet()

我这样做是为了减少“口吃”(我更喜欢在文件顶部而不是在我的代码中使用口吃。)

这是一个正确的成语吗?

这是一个相关的问题。在一个包中,我经常有一些我想向外界公开的类。这些我在该包的__init__.py 中导入。例如,如果ToolSet 在包UI 中并且我想公开它,我会将以下内容放入UI/__init__.py 中:

from ToolSet import ToolSet

这样,我可以从外部模块编写

import UI
...
toolSet = UI.ToolSet()

再次,这是pythonic吗?

【问题讨论】:

  • @Philippe:你可能有兴趣阅读stackoverflow.com/questions/1744258/…
  • 感谢 unutbu。我的搜索没有返回这个问题。
  • 为了防止两个 ToolSet 项(模块名称和类名称)之间的混淆,您最好遵循建议使用仅小写的模块名称的 pep8 指南(因此“来自工具集导入工具集”或“工具集.工具集”。

标签: import python


【解决方案1】:

回答你的第一个问题,就是我用的成语,PEP8 the python style guide支持使用它

虽然可以这样说:

从子流程导入 Popen, PIPE

我喜欢它,因为它减少了输入并确保在文件运行时立即出错(比如你拼错了导入),而不是稍后运行使用导入的函数。

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

from Thing import Thyng

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

import Thing
# ...
def fn():
    Thing.Thyng()

在你运行fn()之前不会出错

关于你的第二个问题,我认为这也是一种很好的做法。当我将一个 large.py 放入包含 __init__.py 和实现文件的目录时,我经常会遇到这种情况。将东西导入__init__.py 使界面保持不变。这也是标准库中的常见做法。

【讨论】:

    【解决方案2】:

    是的。在我看来,两者都是惯用的 Python。

    我倾向于对标准库中的某些模块使用from module import name 形式,例如datetime,但主要用于密切相关的模块,或者模块中经常使用的名称。例如,我通常以这种方式导入 ORM 类。

    对于一些标准模块(尤其是osos.path)以及不是很独特的名称(例如database.sessioncherrypy.session 是两种不同类型的会话),我倾向于使用import module 形式对于不常使用的名称,提及模块名称可提高可读性。

    最后,有一些经验法则(例如import os.path),但使用哪种形式在很大程度上取决于判断、品味和经验。

    【讨论】:

      【解决方案3】:

      要解决它是否是pythonic,请看一下互联网上通常给出的明确答案:http://effbot.org/zone/import-confusion.htm

      还可以查看 ~unutbu 的链接,该链接对此进行了更详细的讨论。

      【讨论】:

        【解决方案4】:

        我一直使用from itertools import chain, ifilter, islice, izip,因为它允许我像那些内置方法一样进行编程,在我看来它们确实应该是这样。

        有一次,在被误入歧途的狂热中,我检查了一大段代码并将from datetime import datetime 替换为import datetime。这是马克吐温观察到的一个很好的例子,即一个抓住老鼠尾巴的人会学到一些其他方式无法学到的东西。这无疑让我明白了为什么可以使用from x import y

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-26
          • 2014-04-19
          相关资源
          最近更新 更多