python - 为什么函数内的 globals() 不能更新交互式 shell 中的变量?

标签 python

今天给自己写了一个“别名导入函数”,因为需要写一个脚本对不同的python文件做变量值检查。

# filename: zen_basic.py

import importlib
def from_module_import_alias(module_name, var_name, alias):
    """ equal to from module import a as b """
    agent = importlib.import_module(module_name)
    globals()[alias] = vars(agent)[var_name]

奇怪的是,如果我启动 Python 交互式 shell,我无法使用此函数导入内容。但是通过在函数之外使用它的内容,它可以工作。

>>> from zen_basic import *
>>> module_name = 'autor'
>>> var_name = 'food'
>>> alias = 'fd'
>>> from_module_import_alias(moduele_name, var_name, alias)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'moduele_name' is not defined
>>> from_module_import_alias(module_name, var_name, alias)
>>> fd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'fd' is not defined
>>> agent = importlib.import_module(module_name)
>>> globals()[alias] = vars(agent)[var_name]
>>> fd
'cake'
>>>

之后我又做了 3 个实验:

    • 执行python -i test.py
    • 在交互式 shell 中导入 zen_basic
    • 调用 from_module_import_alias 函数,失败。
    • 执行 python -i zen_basic.py
    • 调用from_module_import_alias函数,成功。
    • import zen_basic 和调用from_module_import_alias 函数 的代码添加到test.py
    • 执行python -i test.py,成功

在Python交互shell中直接使用from_module_import_alias函数失败是什么原因?

最佳答案

您正在更新错误的全局变量。您正在更新 zen_basic 模块的全局变量,而不是 __main__ 模块(脚本或交互式解释器的 namespace )。 globals() 函数始终返回定义代码的模块的全局变量,而不是调用函数的模块的全局变量。

您必须检索调用框架的全局变量。请注意,很少建议修改调用框架的全局变量,但如果必须,则可以使用 sys._getframe() function 检索调用框架。 :

import sys

def from_module_import_alias(module_name, var_name, alias):
    """ equal to from module import a as b """
    agent = importlib.import_module(module_name)
    calling_globals = sys._getframe(1).f_globals
    calling_globals[alias] = vars(agent)[var_name]

在您的实验中,python -i zen_basic.py 运行 zen_basic 作为主脚本入口,因此 globals() 引用 __main__ 模块。

关于python - 为什么函数内的 globals() 不能更新交互式 shell 中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31205258/

相关文章:

javascript - 对线程对话进行排序

python - 根据原始列和新列中的前一个单元格计算新的 DataFrame 列

python - 计算 Python 脚本中的符号数

python - 在添加新数据之前删除上个月

python - 使用 C 和 Python 代码创建一个 Python 模块

python - 用 Python 比较贷款

python - 无法在 python 列表中追加元素

python - 我需要帮助在 python 和 opencv 中使用 ip camera

python - 使用datastax python-driver从cassandra获取正确的时间戳

python - ReportLab - 无法屏蔽图像 [Google App Engine]