non*_*ing 8 python global-variables
我正在尝试将文本文件中的所有时间戳(形式为'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")
Run Code Online (Sandbox Code Playgroud)
这很好用:运行它的结果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")
Run Code Online (Sandbox Code Playgroud)
有这个错误:NameError: name 'matchobj' is not defined所以我不能直接传递matchobj.
我看过标准的重新页面和标准的re howto,但找不到我需要的信息.我怎样才能避免在这里使用全局变量?我可以以某种方式向replace_time函数传递额外的参数吗?提前致谢.
dme*_*sky 13
你可以在一个闭包中包装一个函数,如下所示:
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")
Run Code Online (Sandbox Code Playgroud)
或者您可以partial像这样使用from stdlib:
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")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2307 次 |
| 最近记录: |