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

时间:2015-11-25 22:58:19

标签: python json string exec

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

我有一个值列表。

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

然后我希望能够单独访问每个值并将它们组合成一个字符串,并在它们之间使用逗号。我写了一些代码,我希望以这种方式格式化一个字符串(' {}' .format()),以便结果如下所示:' 1,2,3 ,4&#39 ;.到目前为止我的代码(如果可能的话,它也是我喜欢使用的代码结构)如下:

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

如果,在作为' exec'的参数给出的字符串中。功能,我写"打印(输出)" IE:

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

然后程序将正常运行并打印出来" 1,2,3,4",但它不会将其存储在'字符串' (这是预期的)

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

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

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

我在python中制作游戏。有一个Character类,它包含各种数据类型的各种属性(如dict,list,int,str,float ....以及一些自定义的:AI,Item,ActiveSkill,PassiveSkill,Effect,Weapon,Armor等等...) 现在,我的计划是能够将游戏进度存储在json树中。为此,我开始为每个实体提供一个方法,将其所有属性转换为存储为字符串的json树。这样,当我想保存游戏并且它来到角色时,它将对其所有属性进行排序,但它还必须调用它所引用的对象(例如ActiveSkills) )。对于列表中的每个ActiveSkill,它必须调用自己的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"))

我知道这段代码目前还没有运行,因为你只能从一个函数中返回,但我真的不知道如何快速简单地解决它。

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

我想最大限度地减少占用的空间,我希望这个系统变得灵活,这样无论你有多少技能,你都可以继续添加越来越多的这些json字符串而不需要改变代码。

2 个答案:

答案 0 :(得分:3)

使用','加入列表:

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}}

所以,不要滚动你自己的编码器,除非真的必须。

答案 1 :(得分:0)

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

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