gpt4 book ai didi

python: re.sub 的替换函数不接受额外的参数——如何避免全局变量?

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

我正在尝试将文本文件中的所有时间戳(格式为“HH:MM:SS”)递增到我的程序的命令行参数指定的秒数。

这是我迄今为止所做工作的简化版本:

import re
from datetime import datetime, timedelta

time_diff = timedelta(seconds=10)

def replace_time(matchobj):
if matchobj.group(1) not in [None, '']:
return (datetime.strptime(matchobj.group(1), "%H:%M:%S") + time_diff).strftime("%H:%M:%S")

print re.sub('(\d\d:\d\d:\d\d)', replace_time, "01:27:55")

这工作正常:运行它的结果是 01:28:05 这正是我想要的。

但是,我听说我应该尽可能少地使用全局变量。所以我想知道是否有一种简单的方法可以将 time_diff 作为参数传递给 replace_time 而不是使用全局变量。

我尝试了显而易见的方法,但失败了:

def replace_time(matchobj, time_diff):
if matchobj.group(1) not in [None, '']:
return (datetime.strptime(matchobj.group(1), "%H:%M:%S") + time_diff).strftime("%H:%M:%S")

time_diff = timedelta(seconds=10)
print re.sub('(\d\d:\d\d:\d\d)', replace_time(matchobj, time_diff), "01:27:55")

出现此错误:NameError: name 'matchobj' is not defined,所以我无法直接传递 matchobj。

我看过 standard re pagestandard re howto , 但在那里找不到我需要的信息。我怎样才能避免在这里使用全局变量?我能以某种方式将额外的参数传递给 replace_time 函数吗?提前致谢。

最佳答案

您可以像这样将一个函数包装在一个闭包中:

def increment_by(time_diff):
def replace_time(matchobj):
if matchobj.group(1) not in [None, '']:
return (datetime.strptime(matchobj.group(1), "%H:%M:%S") + time_diff).strftime("%H:%M:%S")
return replace_time

time_diff = timedelta(seconds=10)
print re.sub('(\d\d:\d\d:\d\d)', increment_by(time_diff), "01:27:55")

或者你可以像这样使用来自 stdlib 的 partial:

from functools import partial

def replace_time(time_diff, matchobj):
if matchobj.group(1) not in [None, '']:
return (datetime.strptime(matchobj.group(1), "%H:%M:%S") + time_diff).strftime("%H:%M:%S")

time_diff = timedelta(seconds=10)
print re.sub('(\d\d:\d\d:\d\d)', partial(replace_time, time_diff), "01:27:55")

关于python: re.sub 的替换函数不接受额外的参数——如何避免全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868554/

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