- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设以下结构...
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/
我是一名优秀的程序员,十分优秀!