2

Pythonで非常に奇妙な状況に遭遇しました。

while True:常にリアルタイムデータを取得するスクリプトにループがあります。データは営業時間中に取得することのみを目的としているため、。というモジュールにヘルパー関数がありますlib/date.py

これは機能です:

def isTime(utc_now=datetime.datetime.utcnow()): 
    '''
    9:00 AM UTC - 5:00 PM UTC Mon - Fri.

    The parameter utc_now can be used to specify a specific     
    datetime to be checked instead of the utcnow(). 
    '''

    week_day = utc_now.weekday()

    # no good on Saturdays and Sundays
    if 5 == week_day or 6 == week_day:
        return False

    now_int = (utc_now.hour * 60) + utc_now.minute

    if (17 * 60) >= now_int >= (9 * 60):
        return True

    return False

時間をチェックする方法はやり過ぎだと思いますが、これは私の関数の単純化されたバージョンです。私の実際の機能には、上記を必要とする一連のタイムゾーン変換も含まれています。

これは私のメインスクリプトです(簡略化):

def main():
    while True:
        do_ten_seconds()

def do_ten_seconds():
    log.info("alive")

    for i in xrange(10):   
        if isTime():
            log.info("its time")
            # do data grabbing
        sleep(1)

これは平日は完璧に機能し、毎週夜に停止して翌朝継続します。ただし、週末には、長い休憩から「回復」しません。言い換えれば、月曜日の朝isTimeに戻ることはありません。True

ログを確認したところ、スクリプトは10秒ごとに「生きている」と出力しますが、データ取得部分は発生しません(「その時間」は出力されません)。したがって、私はこの手段isTimeが戻っていると仮定していFalseます。

関数が週末に頻繁に呼び出さFalseれ、連続して何度も返されるため、Pythonは結果をキャッシュし、それから回復することはありませんか?

isTimeメインスクリプトが障害のあるモードで実行されているときに同じコードインスタンスを生成するとFalse、新しいインスタンスが取得TrueされisTime、完全に機能し始めます。

何が起こっている?

4

2 に答える 2

5

date.pyを初めてインポートするとき、次の行が1回実行されます。

def isTime(utc_now=datetime.datetime.utcnow()):

実行されると、のデフォルト値utc_nowはその瞬間の時刻に設定され、再計算されることはありません。

于 2012-06-25T01:42:56.807 に答える
2

デフォルトの引数はコンパイル時に計算されます。デフォルト値Noneを作成し、を使用してそれを確認しis Noneます。

于 2012-06-25T01:42:57.207 に答える