Python - вызов функции модуля, которая использует globals (), но извлекает только globals () из модуля, а не текущий экземпляр python - PullRequest
0 голосов
/ 09 апреля 2020

python версия: 3.8.1

платформа = Windows 10 pro

среда разработки: визуальный студийный код, блокнот jupyter, командная строка

У меня есть функция, которую я импортирую из персонального модуля, чтобы найти все текущие Pandas - кадры данных в памяти или глобальные переменные (). Однако я получаю только глобальные () из модуля. (Теперь я знаю, что globals () относится только к тому модулю, в котором он вызывается) <--- Это моя проблема! </p>

Как уже говорилось выше, я знаю, что даже с помощью нормальная методология. Вот мой код от начала до конца sh. ** Обратите внимание, что я вызываю свою функцию из модуля, и это будет возвращать только «глобальные переменные модуля ()», а не «локальные глобальные ()» из глобальных переменных моего текущего python экземпляра ().

Код из " my_module "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   

, чтобы вы могли видеть, что я создаю Dataframe в моем модуле и создаю функцию curDFs (), которая возвращает имя переменных в globals (), которые являются dataframes.

Ниже приведен код из совершенно новой 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 глобальных переменных. Однако это должно быть динамически c, а не stati c, как я вижу файл congig.py.

Я думаю, было бы хлопотно создавать эту функцию каждый раз, когда я запускаю эту функцию. Я хочу иметь возможность импортировать его, чтобы я мог поделиться с другими или минимизировать повторяющуюся типизацию, вызванную необходимостью копировать вставку или повторную печать в каждом новом python экземпляре.

Любые комментарии или помощь здесь приветствуются.

1 Ответ

0 голосов
/ 09 апреля 2020

Извините, похоже, я не достаточно внимательно рассмотрел ваш вопрос.

Для вашей проблемы я нашел подсказку на вопрос this .

Кажется, что * Модуль 1007 * может делать то, что вы хотите:

# 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.

...