我试图围绕在python中使用__init__
文件,我虽然我做得不错,但我得到了一个“没有模块命名...”错误。
为了简单起见,我将项目放在link to project。有问题的是pythonds/test/parens.py
,我的所有目录中都有__init__.py
个文件,所以我不确定我在哪里出错了。
我还尝试使用from ..basic.stack import Stack
使用PEP 238并获取错误
ValueError: Attempted relative import in non-package
虽然我所要做的就是将__init__.py
个文件粘贴到我的目录中,使它们成为一个模块,然后我就能从不同的模块中调用它们。
答案 0 :(得分:1)
在__init__.py
文件中,输入:
from myfile import *
例如:
pythonds/test/parens.py
pythonds/test/__init__.py
__init__.py
包含的位置:
from parens import *
这是旧版python版本的脏快速修复版本。 考虑到你有多个子目录,所以对于所有python版本来说(参见打击)都会更好:
在测试文件夹中的__init__.py
:
__all__ = ['tacos','falaffels']
from test.tacos import factory
from test.falaffels import stand
如果您具有以下文件夹结构,则上述应该有效:
main.py
/test/
__init__.py
tacos.py
falaffels.py
还注意到这可能与以下内容重复:How do I write good/correct package __init__.py files
答案 1 :(得分:0)
令人讨厌的是,你忽略了实际的错误:没有名为的模块?如果,正如我怀疑的那样,它说“没有名为'pythonds'的模块”,那么这个问题根本就与__init__.py
无关。只是基础pythonds
目录不在你的Python路径上,大概是因为你在自己的目录中运行测试。
Python会自动将当前目录放在其路径中:因此,如果从pythonds
目录运行测试,您将能够执行from basic.stack import Stack
。否则,您可以将上方 parends
目录的完整路径添加到sys.path
。
其他一些提示:您可能已经知道collections
模块已经定义了一个deque类,并且列表可以很容易地用作堆栈。但更重要的是,请注意Python中没有必要为每个类定义一个单独的文件:所有三个文件都可以存在于同一个stack.py
文件中。
此外,您的测试不是真正的测试。您应该查看unittest
模块,了解如何在Python中编写正确的单元测试。