[英]python: re.sub's replace function doesn't accept extra arguments - how to avoid global variable?
我正在嘗試將文本文件中的所有時間戳(形式為'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。
我看過標准的重新頁面和標准的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")
您當前的方法沒有任何問題。 time_diff
只寫入一次,然后所有將來的訪問都是讀取。 它影響它是一個模塊寬常數。
當您有多個線程訪問對象並且至少有一個線程在寫時,您會遇到共享全局狀態的問題。 這不是在這里發生的,你沒有什么可擔心的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.