gpt4 book ai didi

python - 如何找出从哪个模块导入名称?

转载 作者:IT老高 更新时间:2023-10-28 20:44:34 26 4
gpt4 key购买 nike

在Python程序中,如果名称存在于程序的命名空间中,是否有可能找出该名称是否是从某个模块导入的,如果是,它是从哪个模块导入的?

最佳答案

您可以通过 __module__ 属性查看函数在哪个模块中定义。 From the Python Data model documentation on __module__ :

The name of the module the function was defined in, or None if unavailable.

例子:

>>> from re import compile
>>> compile.__module__
're'
>>> def foo():
... pass
...
>>> foo.__module__
'__main__'
>>>

The Data model later mentions这些类也具有相同的属性:

__module__ is the module name in which the class was defined.

>>> from datetime import datetime
>>> datetime.__module__
'datetime'
>>> class Foo:
... pass
...
>>> Foo.__module__
'__main__'
>>>

您也可以使用 intlist 等内置名称来执行此操作。您可以从 builtins 模块访问它们。

>>> int.__module__
'builtins'
>>> list.__module__
'builtins'
>>>

I can use int and list without from builtins import int, list. So how do int and list become available in my program?

那是因为 intlist 是内置名称。您不必为 Python 显式导入它们就可以在当前命名空间中找到它们。您可以在 CPython virtual machine source code 中亲自查看。 .正如@user2357112 提到的,当全局查找失败时会访问内置名称。这是相关的片段:

if (v == NULL) {
v = PyDict_GetItem(f->f_globals, name);
Py_XINCREF(v);
if (v == NULL) {
if (PyDict_CheckExact(f->f_builtins)) {
v = PyDict_GetItem(f->f_builtins, name);
if (v == NULL) {
format_exc_check_arg(
PyExc_NameError,
NAME_ERROR_MSG, name);
goto error;
}
Py_INCREF(v);
}
else {
v = PyObject_GetItem(f->f_builtins, name);
if (v == NULL) {
if (PyErr_ExceptionMatches(PyExc_KeyError))
format_exc_check_arg(
PyExc_NameError,
NAME_ERROR_MSG, name);
goto error;
}
}
}
}

在上面的代码中,CPython 首先在全局范围内搜索名称。如果失败,那么它会回退并尝试从其执行的当前框架对象中的内置名称映射中获取名称。这就是 f->f_builtins 是什么。

您可以使用 sys._getframe() 从 Python 级别观察此映射。 :

>>> import sys
>>> frame = sys._getframe()
>>>
>>> frame.f_builtins['int']
<class 'int'>
>>> frame.f_builtins['list']
<class 'list'>
>>>

sys._getframe() 返回调用堆栈顶部的帧。在这种情况下,它是模块范围的框架。从上面可以看出,框架的 f_builtins 映射包含 intlist 类,因此 Python 自动生成了这些名称可供您使用。换句话说,它将它们“构建”到范围中;因此术语“内置”

关于python - 如何找出从哪个模块导入名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44851668/

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