gpt4 book ai didi

Python - 函数属性或可变默认值

转载 作者:太空狗 更新时间:2023-10-30 00:51:58 25 4
gpt4 key购买 nike

假设您有一个函数需要维持某种状态并根据该状态表现不同。我知道有两种方法可以实现这一点,其中状态完全由函数存储:

  1. 使用函数属性
  2. 使用可变的默认值

使用稍作修改的 Felix Klings answer to another question 版本,这是一个可以在 re.sub() 中使用的示例函数,这样只有第三个匹配正则表达式的内容才会被替换:

函数属性:

def replace(match):
replace.c = getattr(replace, "c", 0) + 1
return repl if replace.c == 3 else match.group(0)

可变默认值:

def replace(match, c=[0]):
c[0] += 1
return repl if c[0] == 3 else match.group(0)

对我来说,第一个似乎更干净,但我更常看到第二个。哪个更好,为什么?

最佳答案

我改用闭包,没有副作用。

这是示例(我刚刚修改了 Felix Klings answer 的原始示例):

def replaceNthWith(n, replacement):
c = [0]
def replace(match):
c[0] += 1
return replacement if c[0] == n else match.group(0)
return replace

以及用法:

 # reset state (in our case count, c=0) for each string manipulation
re.sub(pattern, replaceNthWith(n, replacement), str1)
re.sub(pattern, replaceNthWith(n, replacement), str2)
#or persist state between calls
replace = replaceNthWith(n, replacement)
re.sub(pattern, replace, str1)
re.sub(pattern, replace, str2)

对于可变的,如果有人调用 replace(match, c=[]) 会发生什么?

对于属性,你破坏了封装(是的,我知道 python 没有在类中实现,原因是差异......)

关于Python - 函数属性或可变默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7183349/

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