如何从已执行的字符串中检索值?
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)
我不太清楚如何表达我的问题,因为这不是人们经常做的事情。 这是我的情况:
我有一个值列表。
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)