Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python`from module import name`vs`import module`_Python_Python 3.x_Importerror - Fatal编程技术网

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使用
vs
import 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()
>>>