Python __使子模块例程在顶级导入时可用

Python __使子模块例程在顶级导入时可用,python,import,initialization,package,Python,Import,Initialization,Package,假设以下结构 root/test.py root/myapp/__init__.py root/myapp/myapp.py # contains My_App_Class() root/myapp/SomeObject.py # contains My_Obj_Class() 如果my\uuuuu init\uuuuuuu.py包含以下结构: from myapp import * import SomeObject __all__ = ['SomeObject'] 我希望

假设以下结构

root/test.py
root/myapp/__init__.py
root/myapp/myapp.py       # contains My_App_Class()
root/myapp/SomeObject.py  # contains My_Obj_Class()
如果my
\uuuuu init\uuuuuuu.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'
这样我就可以有效地从myapp.myapp import*将
从myapp import*
折叠到
从myapp import*

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

yur
\uuuu init\uuuuuuuuuuuuuuuuupy
文件中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

只是不要使用
all
——为了避免歧义,可以将导入更改为:

from myapp import *

换句话说,您的
\uuuu init\uuuu.py
文件应该是:

from .myapp import *
import SomeObject
没有其他线路

另一方面,如果您的
test.py
进一步不正确-如果它以
import myapp
开头,则所有myapp/myapp.py的名称都将位于
myapp
命名空间中。您应该将myapp import*
中的第一行更改为
,以进一步说明问题

必须注意:在从包导入名称的Python项目中,应该避免使用
import*
和variantes。Python程序和项目应该 始终从包/模块中导入单个名称-使用显式编写的名称,任何阅读您的代码的人都会确切知道您使用的每个函数或类来自何处。此外,IDE和其他编程工具将能够检查不存在或不一致的名称,并向您发出警告


但是,请注意,可以在包的
\uuu init\uuuuuuuuuuuuuupy.py
中使用
from module import*
将每个包模块中的名称暴露到包名称空间本身中,这就是您想要的。

听起来您真的在抵制Python模块系统。听起来您需要的是一个文件,
myapp.py
,而不是很多不同的模块。包和模块用于创建名称空间,因为您只需要一个,所以只需要一个模块。您好,我刚刚更正了我的输入错误,现在应该有意义了。类似的示例有matplotlib import mpl的
、bs4 import BeautifulSoup的
。它们共享与上面相同的结构,这是出于它们自己的原因。您在init.py中尝试过:导入myapp,SomeObject uuu all uuu=['myapp','SomeObject']是的,它不起作用-只是尝试过它起作用-我刚刚用Python2.7和Python3对evne进行了测试。谢谢,这是一个包含不好的人工制品的测试用例。这让我一开始就很反感。
from .myapp import *
import SomeObject