gpt4 book ai didi

python - __init__.py::使子模块例程在顶层导入时可用

转载 作者:行者123 更新时间:2023-12-05 04:13:23 25 4
gpt4 key购买 nike

假设以下结构...

root/test.py
root/myapp/__init__.py
root/myapp/myapp.py # contains My_App_Class()
root/myapp/SomeObject.py # contains My_Obj_Class()

如果我的__init__.py包含以下结构:

from myapp import *
import SomeObject

__all__ = ['SomeObject']

我希望能够调用 myapp 并从 myapp/myapp.py 中预先提取例程,以便我可以在 test 中执行以下操作.py:

import myapp

if 'My_App_Class' in myapp.__dict__.keys():
print 'success'
else:
print 'fail'

if 'My_Obj_Class' in myapp.SomeObject.__dict__.keys():
print 'success'
else:
print 'fail'

这样我就可以有效地将 from myapp.myapp import * 折叠成 from myapp import *

In [1]: %run test.py
fail
success

最佳答案

__init__.py 文件中的 __all__ 属性阻止其他名称(从 myapp/myapp.py 导入)在使用 时可见myapp 包。

只是不要使用 all - 也许,为了避免歧义,将导入更改为:

from myapp import *

from .myapp import *

换句话说,您的 __init__.py 文件应该很简单:

from .myapp import *
import SomeObject

没有其他行。

另一方面,您的 test.py 如果进一步不正确 - 如果它以 import myapp 开头,所有 myapp/myapp.py 的名称都将在 myapp 命名空间。您应该将第一行更改为 from myapp import * 作为您在问题中进一步提出的内容。

强制性说明:您应该避免在从包中导入名称的 Python 项目中执行 import * 和变体。 Python 程序和项目应该始终从包/模块中导入单独的名称 - 明确写入名称,任何阅读您代码的人都会确切地知道您使用的每个函数或类来自哪里。此外,IDE 和其他编程工具将能够检查不存在或不一致的名称并向您发出警告。

但是,请注意,可以在包的 __init__.py 中使用 from module import * 来公开名称(在 __all__ 将包的每个模块中的)导出到包命名空间本身 - 这就是您想要的。

关于python - __init__.py::使子模块例程在顶层导入时可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37825318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com