【问题标题】:Get variable by name inside function that will be imorted Python在函数中按名称获取变量,该函数将被 imorted Python
【发布时间】:2018-10-13 01:29:38
【问题描述】:

我尝试跟踪dataframe 的更改以在Jupiter 笔记本的末尾创建一个报告,因此我使用magic 来处理它。我将一些数据框的名称作为字符串获取,并且需要获取它的值。我使用 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()

【问题讨论】:

  • 如果您在引用该变量的导入模块中包含一个小的相关代码示例,那就太好了。它可能就像imported_module.df 一样简单。
  • “我得到了一些数据框的名称作为字符串,需要获取它的值” - 为什么是字符串?
  • jupyter 中的魔法将以下单元格作为字符串返回

标签: python jupyter-notebook global


【解决方案1】:

您可以将调用模块的__name__ 传递给打印函数并使用它来获取DataFrame

my_module.py

import sys

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

calling_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

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2018-02-12
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多