Pretty Print Table#

在 Python 中打印一个列表和字典默认就会递归打印里面所有的元素, 而 Lua 打印 table 时默认只打印它的 reference.

Method 1#

这里我们自己实现了一个递归打印的版本.

print_hash_table_1.lua
 1function print_table(t, indent)
 2    indent = indent or ""
 3    for k, v in pairs(t) do
 4        if type(v) == "table" then
 5            print(indent .. tostring(k) .. ":")
 6            print_table(v, indent .. "  ")
 7        else
 8            print(indent .. tostring(k) .. ": " .. tostring(v))
 9        end
10    end
11end
12
13local person = {
14    name = "John Doe",
15    age = 30,
16    hobbies = {"reading", "swimming"},
17    address = {
18        street = "123 Main St",
19        city = "Anytown"
20    },
21    children = {
22        alice = {
23            name = "Alice",
24            age = 5
25        },
26        bob = {
27            name = "Bob",
28            age = 8
29        }
30    }
31}
32print("==================== person ====================")
33print_table(person)
34
35local person_list = {
36    { name = "Alice", age = 30 },
37    { name = "Bob", age = 25 },
38    { name = "Charlie", age = 35 }
39}
40print("==================== person_list ====================")
41print_table(person_list)
[1]:
import subprocess

subprocess.run(["lua", "print_hash_table_1.lua"])
==================== person ====================
hobbies:
[1]:
CompletedProcess(args=['lua', 'print_hash_table_1.lua'], returncode=0)
  1: reading
  2: swimming
age: 30
children:
  bob:
    name: Bob
    age: 8
  alice:
    name: Alice
    age: 5
name: John Doe
address:
  city: Anytown
  street: 123 Main St
==================== person_list ====================
1:
  name: Alice
  age: 30
2:
  name: Bob
  age: 25
3:
  name: Charlie
  age: 35

Use serpent#

serpent 是 Lua 的一个库. 最新版本是 0.30.2. 我直接将源码下载下来并放在了 Lua 的搜索路径上.

print_hash_table_2.lua
 1local serpent = require("serpent")
 2
 3local person = {
 4    name = "John Doe",
 5    age = 30,
 6    hobbies = {"reading", "swimming"},
 7    address = {
 8        street = "123 Main St",
 9        city = "Anytown"
10    },
11    children = {
12        alice = {
13            name = "Alice",
14            age = 5
15        },
16        bob = {
17            name = "Bob",
18            age = 8
19        }
20    }
21}
22print(serpent.block(person))
23
24local person_list = {
25    { name = "Alice", age = 30 },
26    { name = "Bob", age = 25 },
27    { name = "Charlie", age = 35 }
28}
29print(serpent.block(person_list))
[2]:
import subprocess

subprocess.run(["lua", "print_hash_table_2.lua"])
{
  address = {
    city = "Anytown",
    street = "123 Main St"
  } --[[table: 0x6000024f5080]],
  age = 30,
  children = {
    alice = {
      age = 5,
      name = "Alice"
    } --[[table: 0x6000024f5100]],
    bob = {
      age = 8,
      name = "Bob"
    } --[[table: 0x6000024f5140]]
  } --[[table: 0x6000024f50c0]],
  hobbies = {
    "reading",
    "swimming"
  } --[[table: 0x6000024f5040]],
  name = "John Doe"
} --[[table: 0x6000024f5000]]
{
  {
    age = 30,
    name = "Alice"
  } --[[table: 0x6000024f4d80]],
  {
    age = 25,
    name = "Bob"
  } --[[table: 0x6000024f4f40]],
  {
    age = 35,
    name = "Charlie"
  } --[[table: 0x6000024f4f80]]
} --[[table: 0x6000024f54c0]]
[2]:
CompletedProcess(args=['lua', 'print_hash_table_2.lua'], returncode=0)
[ ]: