0

現在のプロジェクトでは、 pyxbを使用してxml構成ファイルを読み取っています。ただし、コマンドライン引数(argparseを使用して解析)を指定することにより、一部の設定をオーバーライドできるはずです。
より読みやすいコードを取得するために、ユニバーサルアプローチを使用して、更新メソッドを定義したいと思います。pyxbは割り当て時に新しい値を検証するため、パラメーターの更新ではtry-catch-blockを使用する必要があります(この場合、文字列をパターンと照合します)。

これが私が試したことです:

def override_setup(exp, args):
    for param, arg in [[exp.param1, args.param1], [exp.param2, args.param2]]:
        if arg is None:
            continue

        # this doesn't work, because param just references the string object referenced by exp.param1?
        try:                
            param = arg
        except Exception as e:
            print e

    # the following works
    exp.param1 = "stuff"

pyxbパラメーターのargparseコマンドライン引数へのマッピングを含むリストを作成しています。これがすべてがうまくいかないところだと思います。
ある種のループを使用してこの更新を行う方法が必要です(したがって、すべての要素に対してtry-catch-blockを繰り返す必要はありません)。
残念ながら、expは反復可能ではないようです。expの各子には_getDiagnosticName()、argparseによって読み取られた引数へのマッピングとして使用できる文字列を返すメンバーがあります。argparseの結果のdictを取得する方法を説明する記事
を見つけました。したがって、マッピング(pyxb要素-> argparse引数値)はもう問題ではありません。反復が問題です。

何か案は?

4

2 に答える 2

0

私は可能性を見つけましたが、少し醜い解決策です。主な部分はvars()を使用しています(私の質問で参照した記事のように...):

def override_setup(exp, args):
    exp_dict = vars(exp)
    opts = vars(args)

    # iterate over node
    for key in exp_dict:
        cur_param = None
        for param in ['param1', 'param2']:
            # ugly workaround
            # keys are like __{XML-Namespace-URI}_parent__param1
            if key.endswith(param):
                cur_param = param

        if not cur_param or opts[cur_param] is None:
            continue

        try:
            exp_dict[key] = opts[cur_param]
        except Exception as e:
            print e

私の場合、exp_dictには、触れてはいけない内部pyxbのものを表す少なくとも6つの要素が含まれていました。それが、私がこのソリューションを本当に好きではない理由の1つです。しかし、それは私が今持っている最高のものです。

于 2013-02-10T12:52:31.417 に答える
0

After searching some more, I finally found the solution I was looking for: setattr():

def override_setup(exp, args):
    opts = vars(args)

    for param in ['param1', 'param2']:
        if opts[param] is None:
            continue

        try:
            setattr(exp, param, opts[param])
        except Exception as e:
            print e
于 2013-02-10T13:08:47.103 に答える