Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在python中,“;“出口”;来自模块的定制对象_Javascript_Python_Node.js_Import_Export - Fatal编程技术网

Javascript 在python中,“;“出口”;来自模块的定制对象

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

JavaScript中,特别是在node.js设置中,可以拼写
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}