如果类实例化对象不存在,Python避免方法调用吗?

时间:2015-11-18 20:38:34

标签: python python-2.7 oop beautifulsoup

我正在为网络刮刀编写一个课程。该类接受一个BeautifulSoup对象,并尝试查找具有id: kFin(主要财务)的表。

但是,有两种边缘情况可能:表可能不存在,或者表可以存在1个或多个可提取的值。在尝试获取值时,如果某个值不存在(在每个方法中除了try之外),我可以解决此问题。但是,我目前难以理解的是这个问题:

"我如何避免/阻止/返回" N / A"如果kFin表从一开始就不存在,以最可能的pythonic /有效方式?"

class KeyFinancials:

    def __init__(self, page):
        self.page = page

        #TODO: Implement try except when grabbing Financials table

        table = page.find("table", attrs={'id': 'kFin'})

        head = [element.get_text() for element in table.select('th')]
        rows = [element.get_text() for element in table.select('td')]
        self.data = dict(zip(head, rows))

    def annual_sales(self):
        try:
            return self.data['Annual Sales'].rstrip().lstrip()
        except:
            return "N/A"

    def sales_2015(self):
        try:
            return self.data['2015 Sales'].rstrip().lstrip()
        except:
            return "N/A" 

    def annual_net_income(self):
        try:
            return self.data['Annual Net Income'].rstrip().lstrip()
        except:
            return "N/A"

我在课堂上有大约8种类似的方法。如果我试图调用任何类方法,我的return "N/A"脚本中有main.py的好方法吗?

如果我在这里没有100%正确地使用术语,我会道歉,我是自学成才的团队,而且刚刚开始理解课程。

非常感谢你。

1 个答案:

答案 0 :(得分:1)

如果在尝试创建类的实例时找不到表,然后在调用代码中处理异常,则可以选择抛出异常。在__init__中,写一下:

class KeyFinancials:

    def __init__(self, page):
        self.page = page

        table = page.find("table", attrs={'id': 'kFin'})
        if table is None:
            raise ValueError('The table was not found!')

请注意,如果您了解自定义例外情况,则可能需要在此处使用,例如MissingTableError,而不是ValueError。如果没有,不用担心。

现在,在您的调用代码中,每当您尝试创建类时都要检查错误:

try:
    financials = KeyFinancials(page)
except ValueError:
    # oh no, the page didn't have a table!
    print "N/A"

现在,您的示例代码不会使用page,除非立即查找table。也许最好是在KeyFinancials.__init__表格中做出唯一的论证?那样你就可以写:

class KeyFinancials:

    def __init__(self, table):
        self.table = table
        # ...

并在您的调用代码中执行错误检查:

table = page.find("table", attrs={'id', 'kFin'})
if table is None:
    print "N/A"
else:
    financials = KeyFinancials(table)
    # ...