【发布时间】:2014-07-11 21:55:24
【问题描述】:
参见下面的函数。我想要做的是获取我发送的任何字符串,搜索“[”和“]”字符。如果它们存在,这部分文本将被拆分,括号被删除并变成一个字典。然后,我尝试将 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
【问题讨论】:
-
一些一般建议:
content.find('[') >= 0很难看,请改用'[' in content。另外,不要滥用元组拆包。将ind和indend分配移动到单独的行中。最终,如果您最终使循环的整个主体成为条件,最好使用if not condition: continue以避免实际主体的额外缩进级别。即使您使用 100 或 120 个字符的行,水平空间也很有价值!
标签: python