在另一个方法内部调用另一个方法

时间:2020-09-10 20:04:53

标签: python function openpyxl dry

Python有点新功能,但这是一个关于不重复编写函数的问题。

使用openpyxl创建了一个文档类和一个工作簿(wb),其中包含3张纸:

self.sheet1 = self.wb['sheet1']
self.sheet2 = self.wb['sheet2']
self.sheet3 = self.wb['sheet3']

我在此类中也有一个函数,该函数通过sheet3的行查找特定的文本。

def find_text_row_number(self, text):
    text_row_number = set([])

    for row in self.sheet3.iter_rows(self.sheet3.min_row,self.sheet3.max_row):
        for cell in row:
            if cell.value == text:
                text_row_number.add(cell.row)

    return sorted(text_row_number)

我的问题是:如何在程序的其他位置调用此函数,并使其搜索sheet2,而不是sheet3?尝试过查看装饰器并使用默认值(sheet=self.sheet3),但这会引发错误,因为尚未定义self

也许有更有效的方式来编写此特定功能?还是我缺少的某些Python方面可以在这里提供帮助?

2 个答案:

答案 0 :(得分:1)

尝试:

def find_text_row_number(self, text, sheet_name='sheet1'):
    text_row_number = set([])
    sheet = getattr(self, sheet_name)

    for row in sheet.iter_rows(sheet.min_row, sheet.max_row):
        for cell in row:
            if cell.value == text:
                text_row_number.add(cell.row)

    return sorted(text_row_number)

答案 1 :(得分:0)

不要使用单独的变量,请将所有工作表放在列表中。然后,您可以使用索引访问所需的索引。

第一个代码将初始化列表:

self.sheets = [self.wb['sheet1'], self.wb['sheet2'], self.wb['sheet3']]

然后您的其他方法可以采用可选索引。

def find_text_row_number(self, text, sheet_num = 3):
    sheet = self.sheets[sheet_num-1]
    text_row_number = set([])

    for row in sheet.iter_rows(sheet.min_row,sheet.max_row):
        for cell in row:
            if cell.value == text:
                text_row_number.add(cell.row)

    return sorted(text_row_number)

要处理sheet2时,请使用

x.find_text_row_number("text", sheet_num = 2)