Python`from module import name`vs`import module`

2024-06-12 20:02:47 发布

您现在位置:Python中文网/ 问答频道 /正文

这不起作用的原因:

>>> import structlog
>>> structlog.contextvars.bind_contextvars()
AttributeError: module 'structlog' has no attribute 'contextvars'
>>>

但这确实:

>>> from structlog.contextvars import bind_contextvars
>>> bind_contextvars()
>>>

似乎找不到有关何时使用from x import yimport x的文档


Tags: nofrom文档importbind原因attributecontextvars
2条回答

我想知道您使用的是哪个版本的库和Python,因为对于Python 3.8(Win 10 x64)和structlog21.1.0(最新版本),我没有看到错误,并且作为包的code indicates__init__.py),子模块被导入(因为contextvars.py存在):

try:
    from structlog import contextvars
except ImportError:
    contextvars = None  # type: ignore

在一些旧版本中,可能会有所不同,并且子模块可能仅在某些情况下导入,而这些情况在不导入时会导致错误

虽然我无法在单独的环境中复制此问题

~/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)的成员

此处实际使用所遵循的文档是由给定模块(如果有)的维护人员提供的官方文档。它的质量,以及如何导入指南的数量,自然会因作者和模块而异

在这种特殊情况下,official structlog documentation about its context variables module将是一个很好的起点

相关问题 更多 >