【问题标题】:Apply chaining method calls in Python在 Python 中应用链接方法调用
【发布时间】:2020-06-16 10:42:52
【问题描述】:

我会创建一个 python 类“ExcelFile”来处理在工作簿中添加多个工作表,

函数应该是通用的,这样团队中的任何人都可以轻松使用它,

我做了开发,一切都很好,我的代码是这样的:

def addSheet(df,"sheet_name1"):
    -- reading template
    -- add sheet1
    -- replace existing file

在我多次调用该函数后,这取决于我要添加多少工作表,所以:

addSheet(df1,"sheet_name1")
addSheet(df2,"sheet_name2")
addSheet(df3,"sheet_name3")

我想重构我的代码并将其放入 python 类并实现一个设计模式,通过调用来帮助我完成这项工作

xls_file = ExcelFile().useTemplate("template_path").addSheet(df,"sheet_name1").addSheet(df2,"sheet_name2").writeXlsFile("filename")

做这样的事情的设计模式的名称是什么?

【问题讨论】:

  • 您可以调用该流体/流畅的 API - 您可以使用 google 进行研究。 SO 不是协作编程的平台,请尝试解决它,如果遇到具体问题再回来。
  • @PatrickArtner,感谢您的回复,我把解决方案放在搜索之后,
  • 这并不是 Python 中真正常见的 API 设计。
  • @chepner ,我一开始以为是建造者或工厂之类的设计模式,现在,我明白了
  • 是的,但设计模式不是通用的。有些存在以弥补特定语言的缺点,尽管这里不是这种情况。 AFAIK,构建器模式的要点是您可以通过多个函数调用线程化部分构建的对象。这不仅仅是为了让您可以将原本可能是一组独立的变异方法调用集中到一个巨大的表达式中。 (理想情况下,构建器也不会改变任何内部状态,而是在每一步创建一个新的、增强的构建器。)

标签: python python-2.7 design-patterns


【解决方案1】:

所以搜索后: 我做了链式方法

将熊猫导入为 pd 导入openpyxl

class ExcelFile(object):
    template_path = None
    file_path = None
    book = None
    xlwriter = None

    def replaceSheet(self, dataframe, sheet_name):
        pandas_df = dataframe.toPandas()
        self.book = openpyxl.load_workbook(self.template_path)
        self.xlwriter = pd.ExcelWriter(self.template_path, engine='openpyxl')
        # test if the sheet doesn't exist
        sheet_id = self.book.get_sheet_by_name(sheet_name)
        self.book.remove(sheet_id)
        self.xlwriter.book = self.book
        pandas_df.to_excel(self.xlwriter, sheet_name=sheet_name, index=False, header=True)
        return self

    def useTemplate(self, template_path):
        self.template_path = template_path
        return self

    def writeFile(self, file_path):
        self.book.save(file_path)
        self.xlwriter.save()
        self.xlwriter.close()
        return file_path

Anf 没有多次调用该函数,而是通过以下方式调用:

xls_file = ExcelFile()
xls_file.useTemplate(template_path=templatepath) \
    .replaceSheet(dataframe=Sales_df, sheet_name="DB Sales") \
    .replaceSheet(dataframe=cost_df, sheet_name="DB COST") \
    .replaceSheet(dataframe=b2c_df, sheet_name="DB B2C") \
    .writeFile(file_path=local_tmp_file)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多