【问题标题】:Is there anything like Python export?有没有类似 Python 导出的东西?
【发布时间】:2012-12-19 06:27:01
【问题描述】:

我们一直使用 python 的导入机制来导入模块和变量以及其他东西..但是,有什么可以作为导出的吗?喜欢:

我们从一个模块中导入东西:

from abc import *

我们可以像这样导出吗?:

to xyz export *

或 将 a,b,c 导出到 program.py

我知道这个问题不是在这里要问的典型类型的问题..但只是出于好奇..我检查了 python 控制台,没有任何东西作为“导出”存在..也许它与一些存在不同的名字..?

【问题讨论】:

  • 这到底是如何工作的?
  • 你为什么想要那个?
  • 如果任何脚本在任何时候都可以随意地将自己注入到其他模块中,我什至无法想象在 python 中开发的那种噩梦。
  • 听起来类似于臭名昭著的COME FROM
  • 如果你有 a.py 和 b.py,并且 a.py 需要 b.py 的废话 - a.py 应该从 b.py 导入它需要的东西。不要指望其他人会在 a.py 之前加载 b.py,因此 b.py 可以及时将其值导出到 a.py,以便 a.py 能够执行它需要执行的操作。看到这里的问题了吗?

标签: python python-module


【解决方案1】:

首先,导入你想要导出内容的模块,这样你就有了对它的引用。然后将要导出的东西分配为模块的属性:

# to xyz export a, b, c
import xyz
xyz.a = a
xyz.b = b
xyz.c = c

要进行通配符导出,您可以使用循环:

# to xyz export *
exports = [(k, v) for (k, v) in globals().iteritems() if not k.startswith("_")]
import xyz
for k, v in exports: setattr(xyz, k, v)

(请注意,我们在导入模块之前收集要导出的对象列表,这样我们就可以避免导出对我们刚刚导入自身的模块的引用。)

这基本上是猴子修补的一种形式。它有它的时间和地点。当然,要使其工作,必须执行“导出”的模块本身;简单地导入将要修补的模块不会神奇地意识到某处的其他代码正在修补它。

【讨论】:

  • 如何“导出”到通常调用“import my_exporter_module”的任何模块? [没有“*”] 我已经通过在 builtins() 中添加条目来做到这一点,但我想添加与 my_exporter_module 同名的内容。一种在导入时成为某个类的对象的模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多