Javascript 在python中,“;“出口”;来自模块的定制对象
在JavaScript中,特别是在node.js设置中,可以拼写Javascript 在python中,“;“出口”;来自模块的定制对象,javascript,python,node.js,import,export,Javascript,Python,Node.js,Import,Export,在JavaScript中,特别是在node.js设置中,可以拼写module.exports=13在module.js中,然后x=import(“module.js”)其他位置,并将13直接分配给x 当模块导出单个函数时,这可以节省一些代码,我注意到许多广泛使用的包(例如through2)都使用了它 在Python中是否有同样的方法?也许用一些黑魔法 我确实听说过一种叫做loader的东西,我想,它应该在模块可用之前对模块进行一些操作。特别是,我认为SaltStack使用了salt.loader
module.exports=13
在module.js
中,然后x=import(“module.js”)代码>其他位置,并将13直接分配给x
当模块导出单个函数时,这可以节省一些代码,我注意到许多广泛使用的包(例如through2)都使用了它
在Python中是否有同样的方法?也许用一些黑魔法
我确实听说过一种叫做loader的东西,我想,它应该在模块可用之前对模块进行一些操作。特别是,我认为SaltStack使用了salt.loader
中的类似内容,但代码太难,我无法理解。我想我们可以写一个类似的函数:
def loader(module):
m = __import__(module)
return m["__exports__"]
-然后在我们想要导入的模块中的某个地方定义\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但不幸的是,TypeError:“module”对象没有属性“\uu getitem\uuuu”
阻止我们这样做。Python在比Javascript更基本的级别上为语言内置了导入,几乎所有用例都包含在一个简单的示例中
就你的例子而言,它实际上归结为:
从模块导入导出为x
因此,不需要通过更改模块
来节省代码
问题的另一部分是,作为模块作者,您如何限制人们只看到一个符号
一般来说,这不是必需的,只是为了帮助用户了解什么是公共功能,什么是实现细节。Python对此有一些常见的习惯用法:
- 任何以前导下划线开头的名称,如
\u helper
,都被视为私有名称。它们可以正常访问,但这意味着您不应该这样做
- 如果存在模块级变量
\uuuuu all\uuuu=[…]
,则仅将其包含的字符串视为公共字符串。名称必须在模块中单独声明
除了作为文档外,这两个方面都会影响模块导入的一个方面:
从模块导入*
通常不鼓励使用星型导入,但只有公共名称才会被引入本地名称空间。经过一些思考,我明白了,虽然我们不能说m[“\uuu exports\uuu”]
,因为模块对象的类没有\uu getitem\uuu
方法,但我们仍然可以使用“dot”访问模块的一些元素符号:m.\uuuu导出\uuuu
工作
另一种方法是:用下划线屏蔽所有模块级名称,并将要导出的对象指定给以模块命名的变量,然后从模块导入中选择*
loader.py:
exports.py:
Python 2.7:
导入加载程序
>>>e=加载程序加载(“导出”)
>>>e
{'p8':31,'p6':}
>>>从出口到进口*
>>>出口
{'p8':31,'p6':}
Python 3:
导入加载程序
>>>e=加载程序加载(“导出”)
>>>e
{'p6':,'p8':31}
>>>从出口到进口*
>>>出口
{'p6':,'p8':31}
不幸的是,在建议的第一种方法中,我不能在加载程序中使用\uuuuuu all\uuuu
。加载
仅从正在加载的模块中筛选列出的名称,因为没有为模块对象定义\uuu getitem\uuu
在建议的第二种方法中,我没有太多的控制(恶意模块可以导出任意名称并操纵我的命名空间)和灵活性(我无法将模块导出的对象分配给代码中的任意名称)
因此,这里还有一些需要改进的地方
def loader(module):
m = __import__(module)
return m.__exports__
def _f():
return 13
_a = 31
exports = {"p6": _f, "p8": _a}
__exports__ = exports
>>> import loader
>>> e = loader.load ("exports")
>>> e
{'p8': 31, 'p6': <function _f at 0x7fb79d494cf8>}
>>> from exports import *
>>> exports
{'p8': 31, 'p6': <function _f at 0x7fb79d494cf8>}
>>> import loader
>>> e = loader.load ("exports")
>>> e
{'p6': <function _f at 0x7f88ae229ae8>, 'p8': 31}
>>> from exports import *
>>> exports
{'p6': <function _f at 0x7f88ae229ae8>, 'p8': 31}