请参阅以下功能。我想要做的是取我发送的任何字符串,搜索'['和']'字符。如果它们存在,则分割出这部分文本,删除括号并将其转换为字典。然后我尝试匹配dict中的任何值到attrs列表。如果匹配,则将该值插回原始字符串,然后使用新字符串再次调用该函数。条件然后检查是否有更多括号,如果没有,则返回新字符串。
但是当我运行代码时,我为text1返回的值是None。我将print语句放在else子句中以查看那里会发生什么,并且按照我的预期打印新字符串,但是这个字符串不会在return语句中传回。
当我使用text2调用该函数时,该函数与我期望text1保持的字符串相同,该值实际上是分配给string2的原始字符串。
import ast
string1 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit [{'do':'said', 'eiusmod':'tempor', 'incididun':'ut'}]"
string2 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
def formatter(content):
if content.find('[') >= 0:
attrs = ['do', 'fum']
ind, indend = content.find('['), content.find(']')
choice = ast.literal_eval(content[ind+1:indend])
for attr in attrs:
for key, value in choice.iteritems():
if attr == key:
new_choice = choice[key]
new_string = content[:ind] + new_choice + content[indend+1:]
formatter(new_string)
else:
return content
text1 = formatter(string1)
text2 = formatter(string2)
print text1
print text2
答案 0 :(得分:1)
我已经稍微调整了一下你的代码,以便更清楚地发生了什么:
import ast
string1 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit [{'do':'said', 'eiusmod':'tempor', 'incididun':'ut'}]"
string2 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
def formatter(content):
print "content: %s" % content
if content.find('[') >= 0:
print "running if"
attrs = ['do', 'fum']
ind, indend = content.find('['), content.find(']')
choice = ast.literal_eval(content[ind+1:indend])
for attr in attrs:
for key, value in choice.iteritems():
if attr == key:
new_choice = choice[key]
new_string = content[:ind] + new_choice + content[indend+1:]
print "calling formatter with: %s" % new_string
formatter(new_string)
print "back from recursion"
else:
print "running else"
print content
return content
print "string1"
print formatter(string1)
print "string2"
print formatter(string2)
如果查看输出,您会看到在第一次传递时找到了[
,因此我们进入if
子句。在一种情况下发现attr == key
为真,所以我们进入内部if子句,然后触发递归调用formatter(new_string)
在那个调用中,没有[
所以content
返回到格式化程序的原始运行...它被丢弃,因为递归调用formatter()
的输出是没有分配给任何东西。
循环最终结束,执行结束,没有从函数返回任何内容。
如果你想让content
冒泡回调用堆栈,你必须从递归调用中获取返回值并对其执行某些操作。你最终需要返回它,但是如果你想要捕获所有匹配,你需要做一些事情,比如在迭代attrs
时建立一个返回值列表然后在最后返回整个列表。