用异常处理替换ifelse语句

2024-04-20 02:06:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有下面的函数,其中有一个if-else语句。在阅读了this post之后,我认为使用try-catch异常处理可能更好。然而,我不知道如何做到这一点。基本上,如果输入的currency不是AUD,我想用下面的print语句抛出一个异常。你知道吗

def update(self, currency):
    if self.currency == 'AUD':
        url = 'http://www.rba.gov.au/statistics/tables/csv/f17-yields.csv'

        response = urllib2.urlopen(url)
        text = response.read()

        csvfile = StringIO.StringIO(text)
        df = pd.read_csv(csvfile)
        print df

    else:
        print('This currency is not available in Database')

Tags: csvcsvfiletextselfurldfreadif
3条回答

使用异常处理而不是if-else语句会慢得多。你知道吗

我已经在字典here中定位了一个键列表,并附上了计时。对我来说,慢了5倍。你知道吗

如果要强制异常处理,可以使用断言:

def update(self, currency):
    try:
        assert self.currency == 'AUD'
        url = 'http://www.rba.gov.au/statistics/tables/csv/f17-yields.csv'

        response = urllib2.urlopen(url)
        text = response.read()

        csvfile = StringIO.StringIO(text)
        df = pd.read_csv(csvfile)
        print df

    except AssertionError:
        print('This currency is not available in Database')

在这种情况下并不一定理想(在我看来,这是一个LBYL场景),因为平等测试应该更快、更可读,并且可以更好地扩展到更多的货币,假设您从各种不同的货币开始。你知道吗

你通常不想在同一个地方提出和抓住一个例外。相反,您希望在第一次注意到错误的地方引发异常,并在报告问题有意义的地方捕获它。你知道吗

在您展示的代码中,您只想用raise语句替换print调用,可能是ValueError。将要打印的文本作为参数传递给异常:

raise ValueError('This currency is not available in Database')

因为您还没有显示update在哪里被调用,所以我不确定在哪里捕获异常是合适的。异常有用(而不是if/else测试)的一个原因是,如果在某个级别没有有用的方法来处理异常,那么可以让异常从多个函数或结构块中冒泡出来。你知道吗

相关问题 更多 >