python - Python - 调用一个使用 globals() 的模块函数,但它只从模块中提取 globals() 而不是当前的 python 实例
问题描述
蟒蛇版本:3.8.1
平台 = Windows 10 专业版
开发环境:visual studio code、jupyter notebook、命令行
我有从个人模块导入的功能,以查找所有当前的 Pandas - 内存中的 DataFrames 或 globals()。但是我只从模块中获取 globals() 。(我现在知道 globals() 仅适用于调用它的模块) <--- 这是我的问题!
如上所述,我知道这甚至无法通过常规方法远程完成。这是我从头到尾的代码。**请注意,我正在从模块中调用我的函数,这只会从我当前的 python 实例的 globals() 中返回“module globals()”而不是“local globals()”。
来自“my_module”模块的代码:
# my_module.py #
import pandas as pd
module_dataframe = pd.Dataframe({'yourName'},columns = ['Name']) # creates dataframe in my module
def curDFs():
i ='' # create variable before trying to loop through globals() prevents errors when initiating the loop
dfList = []
for i in globals():
if str(type(globals()[i])) == "<class 'pandas.core.frame.DataFrame'>":
dfList.append(i)
return df_list
所以你可以看到我正在我的模块中创建一个数据框并创建函数 curDFs() 以返回 globals() 中作为数据框的变量的名称。
以下是来自全新 python 会话的代码:
# new_window.py #
import my_module as mm
#not importing pandas since already imported into "my_module"
new_dataframe = mm.pd.DataFrame({'name'},columns = ['YourName'])
#calling globals() here will return the "local global variable"->"new_dataframe" created above
#if i call my "curDFs()" function from the module, I return not 'new_dataframe' but the 'module_dataframe' from the module
mm.curDFs()
#returns
['module_dataframe']
我需要这个来只返回“new_dataframe”变量。我该怎么做?我被卡住了,其他所有帖子都只是讨论全局和本地范围或如何创建全局变量的 config.py 文件。但是,这必须是动态的,而不是静态的,因为我看到了 congig.py 文件。
我认为在我启动的每个实例中都必须构建这个函数会很麻烦。我希望能够导入它,这样我就可以与其他人共享或最大限度地减少由于必须在每个新的 python 实例中复制粘贴或重新输入而导致的重复输入。
非常感谢这里的任何评论或帮助。
解决方案
抱歉,看来我没有仔细回答您的问题。
对于您的问题,我在这个问题上找到了提示。
似乎该inspect
模块可以做你想做的事:
# my_module.py #
import pandas as pd
import inspect
module_dataframe = pd.Dataframe({'yourName'},columns = ['Name']) # creates dataframe in my module
def curDFs():
caller_frame = inspect.stack()[1]
caller_module = inspect.getmodule(caller_frame[0])
return [name for name, entry in caller_module.__dict__.items() if str(type(entry)) == "<class 'pandas.core.frame.DataFrame'>"]
这适用于我的测试,但请注意,这可能会在各种情况下失败(链接帖子中有一些警告)。
这是预期的行为。根据Python 语言参考,第 4.2.2 章(名称解析)(强调添加):
如果 global 语句出现在一个块中,则该语句中指定的名称的所有使用都指的是该名称在顶级名称空间中的绑定。通过搜索全局命名空间(即包含代码块的模块的命名空间)和内置命名空间(内置模块的命名空间)来解析顶级命名空间中的名称。首先搜索全局命名空间。如果在那里找不到名称,则搜索内置名称空间。全局语句必须在名称的所有使用之前。
在您的案例中,包含代码块的模块的命名空间my_module.py
是my_module.py
.
推荐阅读
- excel - 使用 VBA 从另一个程序运行 Excel
- flask - flask-admin + sqlalchemy - 在父模型视图中修改相关记录的“集合”
- django - 从 request.FILES 中获取项目
- azure-sql-database - 在 Azure sql 中引入和处理数据的选项
- c++ - 我可以在初始化之前使用 std::array 成员变量中的 data() 指针吗?发出警告
- java - 实现上界泛型方法
- firebase - Firebase 身份验证链接合并帐户问题
- r - 多行 Stargazer 列*具有多个模型*?
- python - 如何使用表单更新 django 中的一行?
- haskell - 如何在 Haskell Stack 中定义对可执行文件的依赖?