__init__.py 没有将模块变成包

__init__.py is not turning the module into a package

我不确定这是否是一个愚蠢的问题,但我对包装和类似的东西没有经验。这是包含文件的树结构:

.
├── main.py
└── stringfunc
    ├── __init__.py
    └── toLower.py

main.py:

    import sys
    import stringfunc

    def main():
      print(stringfunc.toLower.to_lower(sys.argv[1]))
      return 0

    if __name__ == "__main__":
      main()

toLower.py:

    def to_lower(inStr):
      return inStr.lower()

并且 __init__.py 文件为空。 当 stringfunc 目录有一个 __init__.py 文件时,它现在不应该表现得像一个包吗?我知道我可以在 __init__.py 中使用 from .toLower import to_lower 以获得更简单且不那么丑陋的方式,但我只是在一本书中看到此代码也必须有效,但事实并非如此。所以恐怕我不明白它是如何工作的。

这是错误:

AttributeError: module 'stringfunc' has no attribute 'toLower'

显然它仍然被 Python 认为是 "module" 而不是 "package"。

您几乎已经完成了所有需要做的事情。但是,导入不会自动采用所有路径并公开它们。您需要执行以下操作之一:

  • 导入stringfunc.toLower
  • toLower添加到__init__.py

要扩展 "Add toLower" 选项:

foo/__init__.py
# py2k
> from foobar import foobarval
> import foobaz
# py3k
> from foo.foobar import foobarval
> import foo.foobaz as foobaz

foo/foobar.py
> foobarval = 1

foo/foobaz.py
> foobazval = 2
$ python -c 'import foo; print(foo.foobarval)'
1
$ python -c 'import foo; print(foo.foobaz.foobazval)'
2