【问题标题】:What is the right way to organize a project with simple dependencies?组织具有简单依赖项的项目的正确方法是什么?
【发布时间】:2011-11-03 05:49:24
【问题描述】:

在编写代码时,我经常遇到解决琐碎依赖项的问题。例如,让我们以我最近编写的一个 memoizer 对象的布局为例。我的目录结构如下:

memoizer/
  memoizer.py
  tests.py
  strategies/
    __init__.py
    perfect.py
    mru.py
    queue.py
README

问题出在 mru.py 中。 mru.py 包含一个使用 queue.py 中定义的队列的 MRU 类。显然,队列不是记忆器的策略,将其置于策略之下没有任何意义。

我的一个想法是将我的代码设置为如下所示:

memoizer/
  memoizer.py
  tests.py
  strategies/
    __init__.py
    perfect.py
    mru/
      __init__.py
      mru.py
      queue.py
README

这个设置的问题是现在用户必须知道 mru 在一个子包中。

另一个想法是这样安排结构:

memoizer/
  memoizer.py
  tests.py
  strategies/
    __init__.py
    perfect.py
    mru.py
    dependencies/
      __init__.py
      queue.py
README

这可以解决我的问题,但直觉上似乎是错误的做法。

为了解决这种不一致,组织文件的正确方法是什么?

【问题讨论】:

    标签: python file-structure


    【解决方案1】:

    我会建议第二种结构的变体:

    memoizer/
      memoizer.py
      tests.py
      strategies/
        __init__.py
        perfect.py
        mru/
          __init__.py <- This is what used to be mru.py
          queue.py
    README
    

    那么用户就可以import memoizer.strategies.mru

    这是一种快速简便的方法。但是,您可以保留原始的 mru.py 文件,并在您的 __init__.py 中公开其中的项目,如下所示:

    import mru as _mru
    
    SomeClass = _mru.SomeClass
    # etc...
    

    【讨论】:

    • 能否详细说明使用init.py 来暴露mru?我似乎无法从文档中弄清楚它是如何工作的,除了 from x import *.
    • 基本上,python 处理module/__init__.py 文件的方式与处理文件module.py 的方式相同。最简单的方法是在mru 文件夹中将mru.py 重命名为__init__.py
    • 所以我在/memoizer 中使用解释器时得到以下信息。 &gt;&gt;&gt; from strategies.mru import MRU Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; ImportError: cannot import name MRU &gt;&gt;&gt; from strategies.mru.mru import MRU我是不是误会了什么?编辑:没关系-您的编辑消除了我的困惑。
    • from strategies.mru.mru import MRU 告诉 python 假设有一个 strategies/mru/mru.pystrategies/mru/mru/__init__.py 文件,其中定义了名称 MRU。如果您将mru.py 文件重命名为__init__.py,那么您应该只使用from strategies.mru import MRU
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2010-12-12
    • 2013-09-02
    • 2021-04-13
    • 2019-04-21
    • 2019-03-10
    相关资源
    最近更新 更多