gpt4 book ai didi

python - 如何确定通过 `from m import *` 导入的内容?

转载 作者:行者123 更新时间:2023-11-28 22:12:30 25 4
gpt4 key购买 nike

我正在对导入语句进行一些修补,我需要确切地知道 from m import * 导入了哪些成员。文档似乎表明当 __all__ 不存在时,将导入所有不以下划线开头的成员。这在所有情况下都完全正确吗?我知道 inspect.getmembers()dir()m.__dict__ 都有稍微不同的逻辑,所以我并不完全确定哪个(如果有的话)将提供与 import * 相同的列表。

最佳答案

让我们看一下 from m import * 语句的作用:

>>> dis.dis(compile('from m import *', '<module>', 'single'))
1 0 LOAD_CONST 0 (0)
2 LOAD_CONST 1 (('*',))
4 IMPORT_NAME 0 (m)
6 IMPORT_STAR
8 LOAD_CONST 2 (None)
10 RETURN_VALUE

这里的关键是它实际上调用了一个专用的操作码IMPORT_STAR,这是特定于将执行此代码的解释器的实现。此运算符最初在 PEP-0221 中指定但指定的实现细节在 this specific commit 介绍的评论中.

在 CPython 中,这是在 /Python/ceval.c 中找到的(Python 3.7.2) 然后依次调用 import_all_from它显示了字节码解释器内部实际执行的一般逻辑。

在 PyPy 中,这是在 /pypy/interpreter/pyopcode.py 中找到的, 再次很像 C 实现它调用 import_all_from在 RPython 中定义的函数,它同样具有相似的逻辑,但使用的是 Python 程序员更熟悉的语法。

在 CPython 和 pypy 实现中,如果 __all__ 在导入模块中以名称列表的形式出现,所有匹配的赋值都将添加到当前本地范围,包括那些有前缀的名称带下划线 (_)。否则,模块内所有以下划线开头的赋值都将被添加到当前本地作用域。

关于python - 如何确定通过 `from m import *` 导入的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54798679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com