首页 > 解决方案 > 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 实例中复制粘贴或重新输入而导致的重复输入。

非常感谢这里的任何评论或帮助。

标签: pythonpython-3.xpandasdataframeglobals

解决方案


抱歉,看来我没有仔细回答您的问题。

对于您的问题,我在这个问题上找到了提示。

似乎该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.pymy_module.py.


推荐阅读