【问题标题】:Import everything in a Python module inside a function在函数内导入 Python 模块中的所有内容
【发布时间】:2013-07-31 11:38:55
【问题描述】:

我想构造一个模拟from package_name import * 的函数。虽然this question 回答了如何通过修改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')

什么都不会发生。我该如何解决这个问题?

【问题讨论】:

    标签: python


    【解决方案1】:

    你总是可以将你的调用者全局字典传递给函数,然后添加到它。

    【讨论】:

      【解决方案2】:

      您可以在 first_package.py 中创建一个字典变量,它是一个跨模块变量。请参阅链接here 了解如何定义跨模块变量。请参阅 J.F.Sebastian

      提供的回复

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

      【讨论】:

        【解决方案3】:

        诀窍是使用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 是特定于实现的函数。

        【讨论】:

          猜你喜欢
          • 2012-02-15
          • 2020-02-23
          • 2011-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-06
          • 2018-04-05
          相关资源
          最近更新 更多