Pythonのコマンドライン引数で辞書ライクな文字列を読み込み,あらかじめ用意していた辞書のデフォルト値を書き換える方法です.こうすることで関数の引数の扱いが簡単になります.JSONを用います.IPythonで以下のようなコマンドライン引数を想定します.これは辞書をアポストロフィで囲んで1つの文字列にした形をしています.

%run test.py '{"start": "2004-1-10", "end": "2004-8-31"}'

デフォルト値を設定した辞書を作っておき,コマンドライン引数を用いてその辞書の値の一部を変更することを考えます.

import sys
import json
### 辞書argvsの形式とデフォルト値を設定しておきます
### キーに対応する値...には適当なデフォルト値が設定されているものとします
friver_dir = ...
river = ...
stn = ...
start = ...
end = ...
window = ...
### デフォルト値を持つ辞書を作っておきます
argvs = {"friver_dir":friver_dir, "river":river, "stn":stn, \
               "start":start, "end":end, "window":window}
### コマンドライン引数が存在していたらそれを読み込み,辞書のデフォルト値を書き換えます
if len(sys.argv) > 1:  # もしコマンドライン引数が存在すれば
    ### jsonを用いて辞書ライクなコマンドライン引数を辞書に変換する
    argvs_cmd = json.loads(sys.argv[1])  # sys.argv[0]はスクリプト名です
    for key in argvs_cmd.keys():  # コマンドライン引数のkeyに関するループ
        if key in argvs:  # コマンドライン引数の辞書ライクなkeyが辞書に存在したら
            argvs[key] = argvs_cmd[key]  # 辞書のデフォルト値を書き換える
else:  # コマンドライン引数が存在しなければデフォルト値をそのまま使います
    print("No command line argument")
### 最後に値を上書き更新します.
friver_dir = argvs["friver_dir"]
river = argvs["river"]
stn = argvs["stn"]
start = argvs["start"]
end = argvs["end"]
window = argvs["window"]

JSONではdatetimeが直接扱えないので,このようにするのが簡単です.