这似乎是一个补救主题,但我有点不确定如何处理这个问题。我认为的每一个解决方案都显得凌乱。
我正在处理一些代码,这些代码在执行多个操作时构建消息,然后最终使用http响应返回该消息。目前看起来有点像这样:
try:
pdict = parser.parseProtocol(id)
msg = "parsing worked"
except:
msg = "parsing failed"
try:
file = parser.getFile(pdict['filePath'])
msg += "file retrieved"
except:
msg += "file not found"
说我想将代码封装到函数中。我怎么能有一条消息在整个过程中得到更新?字符串是不可变的,所以我不能只将它们传递给函数并修改它们。一个超级丑陋的解决方案是:
(pdict, msg) = parseSomething()
if pdict:
(file, msg) = retrieveFile(pdict, msg)
def parseSomething():
try:
pdict = parser.parseProtocol(id)
return (pdict, "parsing worked")
except:
return (None, "parsing failed")
def retrieveFile(pdict, msg)
try:
file = parser.getFile(pdict['filePath'])
return (file, msg + "file retrieved")
except:
return (None, msg + "file not found")
超级难看。
我可以创建一个消息类,或者使用长度为1的列表,这样会更漂亮,但仍然不是非常pythonic,对吧?我想我只是希望这些函数获取消息字符串并修改它,而不必返回它,但字符串是不可变的,因此这不是默认行为。
要做到这一点,我必须有一个平稳的方法,我只是在消隐。帮助
答案 0 :(得分:1)
将您的消息放入数组中,传递它,然后将每个部分附加到其中。
在发送之前,请执行'.join(msg)。
答案 1 :(得分:1)
考虑将您的邮件放在列表中并随时附加到其中?
messages = []
try:
pdict = parser.parseProtocol(id)
messages.append("parsing worked")
except:
messages.append("parsing failed")
try:
file = parser.getFile(pdict['filePath'])
messages.append("file retrieved")
except:
messages.append("file not found")
print '\n'.join(messages)
如果您的代码路径特别紊乱,请考虑将它们嵌入到类中:
class Tests(object):
def __init__(self):
messages = []
self.pdict = None
def parsetest(self):
try:
self.pdict = parser.parseProtocol(id)
except:
self.messages.append("parsing failed")
else:
self.messages.append("parsing worked")
def retrievetest(self):
if self.pdict is None:
raise Exception("called retrievetest() before successfully parsing")
try:
file = parser.getFile(self.pdict['filePath'])
except:
self.messages.append("file not found")
else:
self.messages.append("file retrieved")
然后是:
tests = Tests()
tests.parsetest()
if condition:
tests.retrievetest()
print '\n'.join(tests.messages)
答案 2 :(得分:1)
使您的消息成为类的成员,并传递该类的实例。
更好的是,在类上创建所有这些函数方法,并将消息保留为对象的属性。