簡體   English   中英

python:re.sub的replace函數不接受額外的參數 - 如何避免全局變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM