繁体   English   中英

在函数内导入Python模块中的所有内容

[英]Import everything in a Python module inside a function

我想构造一个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')

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

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

您可以在first_package.py中创建一个跨模块变量的字典变量。 有关如何定义交叉模块变量的信息,请参阅此处的链接。 请参阅JFSebastian提供的回复

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM