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

问题描述

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方面可以在这里提供帮助?

解决方法

尝试:

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)
,

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

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

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

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

def find_text_row_number(self,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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...