导入Fernet对象和导入完整模块有什么区别?

时间:2019-12-30 12:01:41

标签: python

我对相同事物之间的区别有疑问,但一个是我直接导入,另一个是我导入完整模块。

它们之间的输出必须相同,需要生成一个密钥,但是在第一个示例中,我遇到了一个错误module 'cryptography' has no attribute 'fernet',我想知道为什么吗?

第一个示例:

import cryptography

key = cryptography.fernet.Fernet.generate_key()
print(key)

第二个示例:

from cryptography.fernet import Fernet

key = Fernet.generate_key()
print(key)

它们之间有什么区别?

1 个答案:

答案 0 :(得分:1)

原因是python中的import module导入了module/__init__.py文件[*]中可用的内容。如果module/目录具有submodule/子目录,则并不意味着import module将了解有关module.submodule的任何信息。

尝试一个简单的实验。

创建以下目录和文件:

module/
├── __init__.py
└── submodule
    └── __init__.py

现在将这段代码放入module/__init__.py

X = 1

并将此代码放入module/submodule/__init__.py

Y = 2

现在使用Python:

>>> import module
>>> module.X
1
>>> module.submodule.Y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'module' has no attribute 'submodule'
>>> import module.submodule
>>> module.submodule.Y
2
>>>

如您所见,import module没有引入module.submodule。现在修改module/__init__.py,使其读取

import module.submodule
X = 1

现在,子模块在module/__init__.py内部可见,并将在导入时引入。重新启动Python,然后:

>>> import module
>>> module.submodule.Y
2

[*]我躺在这里。规则比较晦涩,请参阅https://docs.python.org/3/reference/simple_stmts.html#import(在此处搜索__all__),但我的简化对于第一个解释是有用的。