__init__;py没有将模块转换为包

2024-07-08 07:24:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

.
├── 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仍然认为它是一个“模块”,而不是一个“包”


Tags: 文件topyimportreturninitmaindef
1条回答
网友
1楼 · 发布于 2024-07-08 07:24:11

你几乎已经做了你需要做的一切。但是,导入不会自动获取所有路径并公开它们。您需要执行以下操作之一:

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

要展开“添加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

相关问题 更多 >

    热门问题