Получить переменную по имени внутри функции, которая будет импортирована в Python - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь отслеживать изменения dataframe, чтобы создать отчет в конце Jupiter блокнота, поэтому я использую magic для него.Я получаю имя некоторого dataframe в виде строки, и мне нужно получить его значение.Я использовал globals () ['df'] и все было хорошо, пока я не переместил magics_class в отдельный файл, так что при импорте он использует другой globals().

Существуют ли какие-либо механизмы для использования импортированного модуляглобальные переменные, откуда она была импортирована, или любые другие способы получить значения переменной по имени?

Пример:

import pandas as pd
def print_df_by_name(name='df'):
    print(globals()[name])
df = pd.DataFrame({'A': [1,2]})
print_df_by_name('df')

Все в порядке, теперь создайте файл my_module.py с таким содержимым:

def print_df_by_name(name='df'):
    print(globals()[name])

def show_module_globals_keys():
    print(globals().keys())

Если мы попытаемся импортировать наш модуль, функция не будет работать:

from my_module import *

import pandas as pd
df = pd.DataFrame({'A': [1,2]})

print_df_by_name('df')

Это вызовет ошибку, поскольку она использует глобальные переменные файла, это можно увидетьсо второй функцией мы создали:

show_module_globals_keys()

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете передать __name__ вызывающего модуля в функцию печати и использовать его для получения DataFrame.

my_module.py

import sys

def print_df_by_name(name='df', module_name=None):
    print(getattr(sys.modules[module_name], name))

call_script.py

import pandas as pd

from my_module import *

df = pd.DataFrame({'A': [1,2]})

print_df_by_name(name='df', module_name=__name__)

выход

§ python calling_script.py
   A
0  1
1  2
...