I know how to print "all" global variables using the following code
for k,v in pairs(_G) do print("Global key", k, "value", v) end
So my question is how to do that for all variables that are accessible from the currently executing function, something that can do what locals()
does for Python.
Use debug.getlocal
.
Here is an implementation of a locals()
function. It will return a table of locals from the calling scope:
function locals() local variables = {} local idx = 1 while true do local ln, lv = debug.getlocal(2, idx) if ln ~= nil then variables[ln] = lv else break end idx = 1 + idx end return variables end
Notice that in the lua REPL, each line is a separate chunk with separate locals. Also, internal variables are returned (names start with '(' if you want to remove them):
> local a = 2; for x, v in pairs(locals()) do print(x, v) end a 2 (*temporary) function: 0x10359b38
Thanks for the accept. You have unlocked the last piece of the puzzle! ;-)
Upvalues are local variables from outer scopes, that are used in the current function. They are neither in _G
nor in locals()
function upvalues() local variables = {} local idx = 1 local func = debug.getinfo(2, "f").func while true do local ln, lv = debug.getupvalue(func, idx) if ln ~= nil then variables[ln] = lv else break end idx = 1 + idx end return variables end
Example (notice you have to use a for it to show up):
> local a= 2; function f() local b = a; for x,v in pairs(upvalues()) do print(x,v) end end; f() a 2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With