Python`from module import name`vs`import module`
这不起作用的原因:Python`from module import name`vs`import module`,python,python-3.x,importerror,Python,Python 3.x,Importerror,这不起作用的原因: >>> import structlog >>> structlog.contextvars.bind_contextvars() AttributeError: module 'structlog' has no attribute 'contextvars' >>> 但这确实: >>> from structlog.contextvars import bind_contextvars >&g
>>> import structlog
>>> structlog.contextvars.bind_contextvars()
AttributeError: module 'structlog' has no attribute 'contextvars'
>>>
但这确实:
>>> from structlog.contextvars import bind_contextvars
>>> bind_contextvars()
>>>
似乎找不到关于何时从x import y使用
vsimport x
的文档,我想知道您使用的是哪个版本的库和Python,因为对于Python3.8(Win 10 x64)和structlog
21.1.0(最新版本),我没有看到错误,因为(\u init\uuuuuuu.py
),将导入子模块(因为存在contextvars.py):
在一些较旧的版本中,可能会有所不同,并且子模块可能仅在某些情况下导入,而这些情况在不导入时会导致错误。而我无法在单独的环境中复制此问题
~/GivingCaringSolution$ python
Python 3.8.9 (default, May 3 2021, 02:40:41)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import structlog
>>> structlog.contextvars.bind_contextvars()
>>>
…一般的答案是,此行为取决于特定库的构造方式,以及是否将所有子模块(或您尝试使用的子模块,无论如何)如contextvars
解析并添加为导入模块的成员(如structlog
)在导入主模块时
此处实际使用所遵循的文档是由给定模块(如果有)的维护人员提供的官方文档。它的质量,以及如何导入指南的数量,自然会因作者和模块而异
在这种情况下,将是一个很好的起点。导入structlog
默认情况下可能不一定导入任何子模块。@iBug:事实上,父包必须自行自动导入子包。如果需要该子项,则应直接导入它。Python在某些情况下会对您隐藏这一点(os.path
由于设计上的怪癖,最初不需要导入子模块来访问os.path
的成员;即使设计发生了变化,他们也保持了这种行为,只是为了避免破坏只导入操作系统然后使用os.path
API的代码),但您决不能假设一个给定包自动导入其子项。@arnet rufino:请您检查答案并投票/接受其中一个(答案左侧的灰色勾号)好吗?
~/GivingCaringSolution$ python
Python 3.8.9 (default, May 3 2021, 02:40:41)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import structlog
>>> structlog.contextvars.bind_contextvars()
>>>