0

我想构造一个模拟 from package_name import *. 虽然这个问题回答了如何通过修改globals(). globals()但是,对于定义函数的模块来说,它是本地的。

例如,假设我在 中定义以下函数first_package.py

import imp

def load_contents(path):
  """Load everything from another package"""
  module = imp.load_source('', path)
  for k in dir(module):
    if not '__' in k:   # ignore __xxx__ private variables
      globals()[k] = getattr(module, k)

然后在中运行以下代码second_package.py

import first_package

first_package.load_contents('third_package.py')

什么都不会发生。我怎样才能解决这个问题?

4

3 回答 3

1

您可以在first_package.py中创建一个字典变量,它是一个跨模块变量。请参阅此处的链接,了解如何定义跨模块变量。参考JFSebastian提供的回复

采用一种不使用 python 内部机制的简单方法总是好的 - 因为在复杂的应用程序中可能存在此类活动的副作用

于 2013-07-31T05:21:34.450 回答
1

诀窍是使用sys._getframe向上调用堆栈 1 步,然后检索调用者的全局变量。准确的代码是,

def load_contents(path):
  """Load contents of another configuration file"""
  module = imp.load_source('', path)
  glob = sys._getframe(1).f_globals  # globals of calling module
  for k in dir(module):
    if not '__' in k:   # ignore __xxx__ private variables
      glob[k] = getattr(module, k)

请注意,此代码仅适用于 CPython,因为sys._getframe它是特定于实现的函数。

于 2013-07-31T05:12:41.697 回答
0

您始终可以将调用者全局字典传递给函数,然后添加到函数中。

于 2013-07-31T06:01:48.890 回答