1. 程式人生 > >python 函式中定義函式

python 函式中定義函式

一直不明白這樣寫具體有什麼意義。直到我準備實現一個類似與 java 中的 Timer#schedule(TimerTask task,long delay, long period)才發現,似乎 python中沒有提供這種內建的重複定時器。而要實現這種重複定時器,似乎需要使用 “函式中定義函式的”的方式才可以。

def scheduler_build(delay, cmd):
    def build_inner():
        import os
        import threading
        print('execute==> ', delay, cmd)
        os.system(cmd)
        threading.Timer(delay, build_inner).start()
    build_inner()

看上面的程式碼,如果不把delay, cmd作為外部函式的引數,而是作為內部函式的引數,那麼threading.Timer(delay, build_inner)會執行出差,提示沒有給函式提供引數。而放在外部就避免的這個問題。

放在外部,既可以讓內部函式使用到引數,又可以讓內部函式不用傳引數。

下面是完整實現,實現定時,每天在當前時刻執行一次命令:

# -*- coding: utf-8 -*-
def scheduler_build(delay, cmd):
    def build_inner():
        import os
        import threading
        print('execute==> '
, delay, cmd) os.system(cmd) threading.Timer(delay, build_inner).start() build_inner() def get_now(format="%Y-%m-%d %H:%M:%S"): """ 獲取今天的日期 --> 返回字串 :2018-01-24 :param format: "%Y-%m-%d" :return: 返回字串 :2018-01-24 """ import time formatTime = time.strftime(format, time.localtime(time.time())) return
formatTime if "__main__" == __name__: cmd = r'source build/envsetup.sh && lunch full_gm12b-userdebug && repo sync -j8 && make clean && source build/envsetup.sh && lunch full_gm12b-userdebug && make update-api && make -j8 2>&1 | tee build.log' cmd = r'source build/envsetup.sh && lunch full_gm12b-userdebug' scheduler_build(1 * 60 * 60 * 24, cmd) pass

ps: 這個方法實際效果並不理想,感覺老是出現卡死的感覺。~