我对相同事物之间的区别有疑问,但一个是我直接导入,另一个是我导入完整模块。
它们之间的输出必须相同,需要生成一个密钥,但是在第一个示例中,我遇到了一个错误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)
它们之间有什么区别?
答案 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__
),但我的简化对于第一个解释是有用的。