Pythonic方式处理函数之间更新状态字符串?

时间:2011-04-06 15:33:42

标签: python

这似乎是一个补救主题,但我有点不确定如何处理这个问题。我认为的每一个解决方案都显得凌乱。

我正在处理一些代码,这些代码在执行多个操作时构建消息,然后最终使用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,对吧?我想我只是希望这些函数获取消息字符串并修改它,而不必返回它,但字符串是不可变的,因此这不是默认行为。

要做到这一点,我必须有一个平稳的方法,我只是在消隐。帮助

3 个答案:

答案 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)

使您的消息成为类的成员,并传递该类的实例。

更好的是,在类上创建所有这些函数方法,并将消息保留为对象的属性。