Python3导入相对或绝对的正确方法?

rak*_*h a 7 python import package python-2.7 python-3.x

我正在编写一个 python 模块neuralnet。它在 Python2 中一切正常,但在 Python3 中导入失败。

这是我的代码结构。

neuralnet/
    __init__.py
    train.py         # A wrapper to train (does not define new things)
    neuralnet.py     # Defines the workhorse class neuralnet
    layer/
        __init__.py
        inlayer.py       # Defines input layer class
        hiddenlayer.py

application/         # A seperate application (not part of the package)
   classify.py       # Imports the neuralnet class from neuralnet.py
Run Code Online (Sandbox Code Playgroud)

train.py需要导入neuralnet.py 的neuralnet类。

neuralnet.py需要导入layers/inlayer.py

(我更喜欢相对进口。)

我有一个不同的应用程序 ( classify.py) 需要导入这个模块。我在哪里...

from neuralnet.neuralnet import neuralnet
Run Code Online (Sandbox Code Playgroud)

我尝试了几种导入方式。要么我得到一个错误(主要是像 parent 这样的神秘未导入)

  1. 运行 train.py(它是神经网络模块的一部分)

    from . import layer  # In file neuralnet.py
    SystemError: Parent module '' not loaded, cannot perform relative import
    
    Run Code Online (Sandbox Code Playgroud)

或者

  1. 运行classify.py(在模块之外)。

    from layer.inlayers import input_layer   # In file neuralnet.py
    ImportError: No module named 'layer'
    
    Run Code Online (Sandbox Code Playgroud)

我的导入在 Python2 中运行良好多年。我想知道 Python3 对我的期望是什么?我应该移到train.py我的模块之外(从技术上讲它不是模块的一部分)?请建议最佳做法。

Jan*_*cke 6

在 Python 3 中,禁止隐式相对导入,请参阅https://www.python.org/dev/peps/pep-0328/https://docs.python.org/release/3.0.1/whatsnew/3.0。 html#removed-语法

相对导入唯一可接受的语法是 from .[module] 导入名称。所有不以 . 被解释为绝对进口。(PEP 0328)

from .stuff import Stuff是一个显式的相对导入,您“应该”尽可能使用它,并且必须尽可能在 Python 3 中使用。前往/sf/answers/852138451/对相对导入进行更深入的分析。

  • 你真的应该先清理你的问题(它仍然指的是 net.py)。然后,确保您正确使用了`__init__.py`。在那里,您指定包的公共接口。也就是说,在`neuralnet/__init__.py` 中,你最好导入相关的所有内容,并通过`__all__` 控制应该暴露给外部的内容。与您的图层包相同。神经网络包应该只从层导入你在 `layers/__init__.py` 中明确公开的那些实体。 (2认同)