代码之家  ›  专栏  ›  技术社区  ›  Philippe Beaudoin

在Python中,“从模块导入类名”这个成语是典型的吗?

  •  3
  • Philippe Beaudoin  · 技术社区  · 16 年前

    因为我喜欢小文件,所以我通常为每个Python模块放置一个“公共”类。我用它包含的类的相同名称命名模块。例如,这个类 ToolSet 将在中定义 ToolSet.py .

    在一个包中,如果另一个模块需要声明类工具集的对象,我使用:

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

    而不是:

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

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

    这是一个正确的成语吗?

    这是一个相关的问题。在一个包中,我经常有一些类,我希望将它们公开给外部世界。我进口的这些 __init__.py 为了那个包裹。例如,如果 工具集 在包装中 UI 我想把它暴露出来,我会把下面的 UI/__init__.py :

    from ToolSet import ToolSet
    

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

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

    再说一遍,这是蟒蛇吗?

    4 回复  |  直到 16 年前
        1
  •  5
  •   Nick Craig-Wood    16 年前

    为了回答你的第一个问题,这就是我使用的成语,它的使用得到了 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 以及实施文件。把东西导入 π介子 保持接口不变。这也是标准库中的常见做法。

        2
  •  0
  •   ddaa    16 年前

    对。在我看来,它们都是惯用的蟒蛇。

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

    我倾向于使用 import module 一些标准模块的形式(尤其是 os os.path )对于那些不太明显的名字(比如 database.session cherrypy.session 作为两种不同的会话)和用于不经常使用的名称,其中提到模块名可以提高可读性。

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

        3
  •  0
  •   Brent Newey    16 年前

    要解决是否是蟒蛇的问题,请看一下互联网上通常的最终答案是什么: http://effbot.org/zone/import-confusion.htm

    还可以查看~unutbu的链接,该链接更详细地讨论了这一点。

        4
  •  0
  •   Robert Rossney    16 年前

    我用 from itertools import chain, ifilter, islice, izip 一直以来,因为它允许我编程,就好像那些是内置的方法一样,按照我的想法,它们确实应该是这样的。

    有一次,在错误的正确性狂热中,我经历了一大段代码并替换了 from datetime import datetime 具有 import datetime . 这是马克吐温观察到的一个很好的例子,一个用尾巴抓老鼠的人会学到一些其他方法无法学到的东西。它肯定让我明白为什么可以使用它 from x import y .