Module Python';s";从一些“U模块导入*”中;在卢阿

Module Python';s";从一些“U模块导入*”中;在卢阿,module,lua,Module,Lua,在Python中,我可以从my_module import*编写,my_module的所有成员都可以在本地范围内使用。e、 g 我的模块定义: my_module = {} my_module.a = 1 my_module.b = 2 在其他文件中使用: from my_module import * return a + b #=> 3 我能在卢阿做这个吗?如何获取?要在本地范围内获取这些值,您唯一的选择是实际管理它们: --in main.lua local mymodule =

在Python中,我可以从my_module import*编写
,my_module
的所有成员都可以在本地范围内使用。e、 g

我的模块定义:

my_module = {}
my_module.a = 1
my_module.b = 2
在其他文件中使用:

from my_module import *
return a + b
#=> 3

我能在卢阿做这个吗?如何获取?

要在本地范围内获取这些值,您唯一的选择是实际管理它们:

--in main.lua
local mymodule = require("mymodule")
local a, b = mymodule.a, mymodule.b

--in mymodule.lua
return {a = 1, b = 2}
或者,或者:

--in main.lua
local a, b = table.unpack(require("mymodule"))

--in mymodule.lua
return {1, 2}
如果您不想实际命名它们,那么唯一的方法就是将它们放在全局范围内。以下是两个例子:

--Python's from mymodule import *
--in main.lua
require("mymodule")
print(a + b)

--in mymodule.lua
a, b = 1, 2


--Python's import mymodule
--in main.lua
require("mymodule")
print(mymodule.a + mymodule.b)

--in mymodule.lua
mymodule = {a = 1, b = 2}
这些都是有效的方法,但最常用和最安全的方法是第一种

另一种可能是尝试更改环境,修改
\u ENV
值:

--Python's from mymodule import *
--in main.lua
local _ENV = require("mymodule")

--in mymodule.lua
return {a = 1, b = 2}

但是,通过更改环境,您将无法访问全局范围内的所有变量(除非您将它们预先声明为本地变量(
local print=print;_ENV=require(“mymodule”);print(a);
),或者将所有变量从
\G
表复制到从
mymodule
返回的表中),这通常不是一件愉快的事情。

这不是完全可以实现的,因为修改
local
值(
debug.setlocal
不能定义新的局部变量)是不完美的。最好的办法是调整你的环境,因为污染全球范围不是一个好主意,但这不是小事

如果小心的话,这实际上可以优雅地完成。我会说一些,因为总会有一条警告,无论您使用什么函数/块,都必须手动调整您的环境。在Lua5.2+中,
local\u ENV=…
是必需的。在Lua5.1中,
setfenv(1,…)
将起到作用,而且可以说对眼睛更容易

这是我们能做的。我们首先定义一个返回克隆环境的函数<代码>克隆是浅表复制功能

return function (env)
    env = clone(env or _G)

    return env
end
接下来,我们添加自定义的
import
函数,该函数直接修改我们的新环境,而不是返回任何内容(如
require
does)。在这里,您可以得到好的和复杂的结果,实现不同的方法来决定将什么导入到环境中,以及如何导入。(“*”,例如)

我们可以将其用作:

local _ENV = require('import')()
-- setfenv(1, require('import')())

import('module_name', 'a', 'b')

return a + b
在小范围内,这是一个相当大的开销,只是为了避免:

local module_name = require('module_name')
local a, b = module_name.a, module_name.b
在有许多导入的大型文档中,它可能更有用。导入通常以任何方式聚集在文档的顶部,因此额外的噪音并不严重。如果您可以在某个地方将
env
设置为全局值,它看起来会更干净一些

local _ENV = env()

import('webserver', 'open', 'status', 'close')
import('database', 'connect', 'query', 'disconnect')
import('json', 'parse', 'stringify')
...
也可用于创建沙盒,前提是在重写
import
函数时要小心,不要使用
require

local my_env = env { print = print }
my_env.import('my_mod', 'foo', 'bar')

local chunk = loadfile('my_file.lua', 'bt', my_env)

local my_module=require(“my_module”);本地a,b=我的_模块.a,我的_模块.b;返回a+b
,这更像是从my_模块导入a,b。如果有(极端的例子)500件东西我正在导入呢?我不希望手动导入所有这些文件。
local my_env = env { print = print }
my_env.import('my_mod', 'foo', 'bar')

local chunk = loadfile('my_file.lua', 'bt', my_env)