gpt4 book ai didi

python - 逻辑相似功能的设计模式/解决方案,无需重复代码

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:43 25 4
gpt4 key购买 nike

我正在为以下(通用)问题寻找一个优雅的解决方案。我想实现几种协议(protocol)来访问文件。比如说 ftp 和 tftp。将来可能会添加更多。现在我正在做:

get_file(filename):
# some generic code for opening the file etc.
if mode == 'ftp':
get_file_ftp(filename)
else:
get_file_tftp(filename)
# some generic code for closing the file etc.

get_file_ftp(filename):
# ftp-specific code

get_file_tftp(filename):
# tftp-specific code

对于 put_file()ls() 和其他十几个函数也是如此。随着代码的增长,这开始变得丑陋。所以我的问题是:有没有更聪明的方法来完成工作?有一种设计模式对这个用例有意义吗?如果是这样,我将如何在 Python 中实现这一点?

最佳答案

您可以重构的两种模式是策略和装饰器。

Decorator Pattern通常使用上下文管理器在 Python 中实现。有一个库可以使它们更容易实现,contextlib :

from contextlib import contextmanager

@contextmanager
def get_file(filename):
# some generic code for opening the file etc.
yield
# some generic code for closing the file etc.

yield 语句使您能够在 with block 中注入(inject)任何您想要的内容:

with get_file(filename) as resource:
get_file_ftp(resource)

或者:

with get_file(filename) as resource:
get_file_tftp(resource)

with block 将确保执行 yield 之后的语句,即使存在异常也是如此。

实现装饰器的另一种方法是使用 Python 的 decorator syntax 。我建议使用上下文管理器,因为我认为您想要在语句前后发生任何事情。 Python 的装饰器语法将使您必须自己实现异常处理。装饰器修改函数

def get_file(function):
def generic_code(filename):
... # some generic code for opening the file etc.
function(filename)
... # some generic code for closing the file etc.
return generic_code

用法:

@get_file
def get_file_ftp(filename):
... # ftp-specific code

或者,使用 Strategy Pattern ,您可以将处理不同文件源的策略传递给 get_file 函数:

def get_file(filename, file_strategy):
# some generic code for opening the file etc.
file_strategy(filename)
# some generic code for closing the file etc.

然后像这样使用它:

get_file(filename, get_file_ftp)

或者:

get_file(filename, get_file_tftp)

关于python - 逻辑相似功能的设计模式/解决方案,无需重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35625725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com