【发布时间】:2017-11-17 22:54:16
【问题描述】:
我来到this question,并对tensorflow 开发人员试图使tensorflow 目录显示为实际包而感到非常失望,而实际包根实际上是tensorflow/python。通过使用__init__.py 格式的文件
from tensorflow.python import *
del python
他们努力实现这一目标。这会导致在使用包时出现一些不一致的行为(至少在我看来是这样),例如
import tensorflow.python # seems to work
tensorflow.python # AttributeError: no attribute 'python'
from tensorflow.python import Session # works as expected
tensorflow.python.Session # AttributeError: no attribute 'python'
from tensorflow import python # works as expected
tensorflow.nn # works as expected
import tensorflow.nn # ImportError: no module 'tensorflow.nn'
tensorflow.nn.tanh # works as expected
from tensorflow.nn import tanh # ImportError: no module 'tensorflow.nn'
现在,我想知道是否/如何可以避免大多数/所有这些问题以获得更一致的行为。通过不删除python 属性,可以轻松解决第一组不一致问题。但是,考虑到目标是让整个包看起来像是一个子包,这可能并不完全令人满意。
为简单起见,让我们考虑以下包结构
package/
__init__.py
api/
__init__.py
code.py
package/api/code.py 看起来像
def a():
return 'alpha'
def b():
return 'bravo'
而package/api/__init__.py 将是
import package.api.code
是否可以创建package/__init__.py 以便以下工作
import package.api # ImportError: no module 'package.api'
package.api # AttributeError: no attribute 'api'
from package.api import code # ImportError: no module 'package.api'
package.api.code # AttributeError: no attribute 'api'
from package import api # ImportError: cannot import 'api'
package.code # works as expected
import package.code # works as above
package.code.a # works as expected
from package import a # correctly imports function a
我相信最后四行代码应该通过添加到sys.modules 来给出预期的结果,但我似乎无法找到使import package.api 失败的方法。
有人知道如何做到这一点吗?请随意指出我忽略或应考虑实现上述目标的用例。
【问题讨论】:
-
可以试试:import package.code as code
-
@PeterMajko 你是什么意思?如果
import package.code正常工作,这应该正常工作...... -
如果你使用 "import x from y as z" 可以完美运行:Check this image
-
@PeterMajko 我知道,我注意到
from tensorflow import python确实有效(我相应地编辑了我的问题),但应该吗?我假设tensorflow/__init__.py中的del python的想法是让tensorflow 包看起来好像是tensorflow/python。在这种情况下,这不是我希望看到的那种行为。 -
他们这样做是有原因的。也许问他们为什么采取这种方法? :)
标签: python packages python-import