gpt4 book ai didi

python - 如何在没有类的情况下在 Python 中维护状态?

转载 作者:太空狗 更新时间:2023-10-29 17:23:20 24 4
gpt4 key购买 nike

有没有pythonic如何在不完全面向对象的情况下维护状态(例如,出于优化目的)?

为了更好地说明我的问题,下面是我在 JavaScript 中经常使用的模式示例:

var someFunc = (function () {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());

从外部看,这只是一个与其他任何函数一样的函数,不需要初始化对象或类似的东西,但闭包允许一次计算值,然后我基本上将其用作常量。

Python 中的一个例子是优化正则表达式——使用 re.compile 很有用并存储了 match 的编译版本和 search操作。

我所知道的在 Python 中执行此操作的唯一方法是在模块范围内设置一个变量:

compiled_regex = compile_my_regex()

def try_match(m): # In reality I wouldn't wrap it as pointlessly as this
return compiled_regex.match(m)

或者通过创建一个类:

class MatcherContainer(object):
def __init__(self):
self.compiled_regex = compile_my_regex()
def try_match(self, m):
self.compiled_regex.match(m)

my_matcher = MatcherContainer()

前一种方法是临时的,它上面声明的函数和变量相互关联并不是很清楚。它还会稍微污染模块的 namespace ,我对此不太满意。

后一种方法看起来很冗长,而且在样板文件上有点沉重。

我能想到的处理这个问题的唯一其他方法是将任何像这样的函数分解到单独的文件(模块)中,然后只导入函数,这样一切都很干净。

有更多经验丰富的 Python 开发者对如何处理这个问题有什么建议吗?或者您只是不担心并继续解决问题?

最佳答案

您也可以使用默认参数完成此操作:

def try_match(m, re_match=re.compile(r'sldkjlsdjf').match):
return re_match(m)

因为默认参数只在模块导入时计算一次。

或者更简单:

try_match = lambda m, re_match=re.compile(r'sldkjlsdjf').match: re_match(m)

或者最简单的:

try_match = re.compile(r'sldkjlsdjf').match

这不仅节省了重新编译时间(无论如何实际上都在内部缓存在 re 模块中),而且还节省了“.match”方法的查找。在繁忙的功能或紧密的循环中,那些“。”决议可以加起来。

关于python - 如何在没有类的情况下在 Python 中维护状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11866419/

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