将Python个字典插入另一个字典,生成.plist文件?

Insert Python dictionary into another dictionary, to generate .plist file?

我正在尝试使用 plistlib 库生成一个 .plist 文件,在 macOS Python 2.7 中可用。

以下代码有效:

#!/usr/bin/env python

from plistlib import writePlist

patches = [
    {
        'Arch': 'x86_64',
        'Base': 'early'
    },
    {
        'Arch': 'x86_64',
        'Base': 'late'
    }
]

result = [
    {
        'Arch': 'x86_64',
        'BundlePath': 'Alpha.kext'
    },
    {
        'Arch': 'x86_64',
        'BundlePath': 'Beta.kext'
    }
]
for i in patches:
    result.append(dict(i))

settings = {
    'Kernel': {
        'Add': result
    }
}
writePlist(settings, 'config.plist')

并生成一个 config.plist 文件,其内容为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Kernel</key>
    <dict>
        <key>Add</key>
        <array>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>Alpha.kext</string>
            </dict>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>Beta.kext</string>
            </dict>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>Base</key>
                <string>early</string>
            </dict>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>Base</key>
                <string>late</string>
            </dict>
        </array>
    </dict>
</dict>
</plist>

但是,我的 config.plist 需要在另一个词典中包含 patches 个词典:

            <dict>
                <dict>
                    <key>Arch</key>
                    <string>x86_64</string>
                    <key>Base</key>
                    <string>early</string>

正确的配置文件必须如下所示(请参阅编辑器中的第 21 和 22 行):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Kernel</key>
    <dict>
        <key>Add</key>
        <array>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>Alpha.kext</string>
            </dict>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>Beta.kext</string>
            </dict>
            <dict>
                <dict>
                    <key>Arch</key>
                    <string>x86_64</string>
                    <key>Base</key>
                    <string>early</string>
                </dict>
                <dict>
                    <key>Arch</key>
                    <string>x86_64</string>
                    <key>Base</key>
                    <string>late</string>
                </dict>
            </dict>
        </array>
    </dict>
</dict>
</plist>

如何编辑我的 setup.py 文件以生成正确的 dictionary inside dictionary 输出?如果你想知道为什么我拆分代码,是因为这是一种非常简化的格式,实际代码相当复杂。因此,我需要一个在上述代码设计中的解决方案。感谢您的帮助。

所需的输出看起来不正确。你的“字典的字典”没有钥匙。我怀疑应该是这样的

<dict>
    <key>Patches</key>
    <array>
        <dict>
            <key>Arch</key>
            ...
        </dict>
        <dict>
            <key>Arch</key>
            ...
        </dict>
    </array>
</dict>

如果是这样,这里是你如何做到这一点,使用“补丁”键。

patches = [
    {
        'Arch': 'x86_64',
        'Base': 'early'
    },
    {
        'Arch': 'x86_64',
        'Base': 'late'
    }
]

result = [
    {
        'Arch': 'x86_64',
        'BundlePath': 'Alpha.kext'
    },
    {
        'Arch': 'x86_64',
        'BundlePath': 'Beta.kext'
    }
]
result.append({"Patches": patches})

settings = {
    'Kernel': {
        'Add': result
    }
}
writePlist(settings, 'config.plist')

输出

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Kernel</key>
        <dict>
                <key>Add</key>
                <array>
                        <dict>
                                <key>Arch</key>
                                <string>x86_64</string>
                                <key>BundlePath</key>
                                <string>Alpha.kext</string>
                        </dict>
                        <dict>
                                <key>Arch</key>
                                <string>x86_64</string>
                                <key>BundlePath</key>
                                <string>Beta.kext</string>
                        </dict>
                        <dict>
                                <key>Patches</key>
                                <array>
                                        <dict>
                                                <key>Arch</key>
                                                <string>x86_64</string>
                                                <key>Base</key>
                                                <string>early</string>
                                        </dict>
                                        <dict>
                                                <key>Arch</key>
                                                <string>x86_64</string>
                                                <key>Base</key>
                                                <string>late</string>
                                        </dict>
                                </array>
                        </dict>
                </array>
        </dict>
</dict>
</plist>