__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
我不确定这是否是一个愚蠢的问题,但我对包装和类似的东西没有经验。这是包含文件的树结构:
.
├── 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