如何从已执行的字符串中检索值?

How to retrieve a value from an executed string?

我不太清楚如何表达我的问题,因为这不是人们经常做的事情。 这是我的情况:

我有一个值列表。

Values= ["1","2","3","4"]

然后我希望能够单独访问每个值并将它们组合成一个字符串,中间用逗号分隔。我写了一些代码,我想以这样的方式格式化一个字符串('{}'.format()),以便结果看起来像这样:'1,2,3,4'。到目前为止,我的代码(这也是我希望尽可能使用的代码结构)如下:

string = "{}".format(exec(
    "Out= ''\n"
    "for value in Values:\n"
    "    Out+= value + ','\n"
    "Out"))
print(string)

如果在作为 'exec' 函数的参数给出的字符串中,我写 "print(Out)" 即:

string = "{}".format(exec(
    "Out= ''\n"
    "for value in Values:\n"
    "    Out+= value + ','\n"
    "print(Out)"))

然后程序会正常运行打印出“1,2,3,4”,但不会存入'string'(这是意料之中的)

因此我想添加一个函数,以确保它可以 return 一些东西。我写了以下内容,但正如预期的那样,它也没有用。字符串仍然是 None:

string = "{}".format(exec(
    "def do_stuff():\n"
    "    Out = ''\n"
    "    for value in Values :\n"
    "       Out += value + ','\n"
    "    return Out \n"
    "do_stuff()"))

现在,我确实意识到这种组合字符串的方法远不是组合字符串的首选方法,但让我给你一些背景信息。

我正在 python 制作游戏。有一个Characterclass,里面包含各种数据类型的各种属性(比如dict、list、int、str、float....还有一些自定义的:AI、Item、ActiveSkill、PassiveSkill、Effect ,武器,盔甲等...) 现在,我的计划是能够将游戏进度存储在 json 树中。为此,我开始为这些实体中的每一个提供一个方法,该方法将其所有属性转换为 json 存储为字符串的树。这样,当我想要保存游戏并涉及角色时,它会对其所有属性进行排序,但它也必须调用它所引用的对象(例如 ActiveSkills)。对于列表中的每个 ActiveSkills,它必须调用自己的 json 语法字符串并使用逗号组合这些字符串。

下面是我的一些代码,可以帮助您理解我想要做什么:

json += \
    '"ActiveSkills":[{oActiveSkills}],' \
    '"PassiveSkills":[{oPassiveSkills}].' \
    '"Effects":[{oEffects}],'.format(
        oActiveSkills=exec(
            "Skills = ''\n"
            "for skill in self.ActiveSkills:\n"    # ActiveSkills is a list of ActiveSkill objects
            "    Skills+=skill.encode_to_json() + ','\n"
            "return Skills"),
        oPassiveSkills=exec(
            "Skills = ''\n"
            "for skill in self.PassiveSkills:\n"    # PassiveSkills is a list of PassiveSkill objects
            "    Skills+=skill.encode_to_json() + ','\n"
            "return Skills"),
        oEffects=exec(
            "Effects = ''\n"
            "for effect in self.Effects:\n"    # Effects is a list of Effect objects
            "    Effects+=effect.encode_to_json() + ','\n"
            "return Effects"))

我知道这段代码目前没有 运行,因为你只能从一个函数中 return,但我真的不知道如何快速完成它简单的方法。

我作为最后的手段保存的一个解决方案是手工完成所有事情。 IE:有某种 for 循环可以从 returned 值创建一个字符串。将此字符串添加到 json 字符串中,之后您将使用 "},{" 手动打开和关闭,并确保末尾没有 ","。然后对 PassiveSkills 和 Effects 也重复此操作。最后用“}”结束json字符串,加入'json'(字符串类型)变量...

我想尽量减少 space 占用的空间,我希望这个系统具有灵活性,这样无论您拥有多少技能列表,都可以继续添加越来越多这些 json 个字符串无需更改代码。

使用 ',' 加入列表:

Values = ["1","2","3","4"]
result = ",".join( Values )
print(result)

有关 str.join(iterable) 的更多信息,请参见 here 联机文档。

为了更好地存储字典和列表(以及使用 pickle,对象),您应该查看 Python 标准库中的 json 和 pickle 包。

例如 json:

import json

mydata = {}
mydata['hello'] = { 'value1':1, 'valuuelist':[1,2,3,4] }

print(json.dumps(mydata))

输出:

{"hello": {"valuuelist": [1, 2, 3, 4], "value1": 1}}

所以,除非您真的必须这样做,否则不要使用自己的编码器。

要将序列中的每个元素连接成一个字符串,您可以使用连接方法。

   L=['1','2','3']
   string=",".join(L)
   print(L)