0

对于我当前的项目,我正在使用pyxb读取 xml 配置文件。但是应该可以通过提供命令行参数(使用 argparse 解析)来覆盖某些设置。
为了获得更具可读性的代码,我想使用通用方法并定义更新方法。参数更新必须使用 try-catch-block,因为 pyxb 确实在分配时验证新值(在这种情况下检查字符串是否符合模式)。

这是我尝试过的:

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 的每个孩子都有一个 member _getDiagnosticName(),它返回一个字符串,我可以将其用作到 argparse 读取的参数的映射。
我发现一篇文章描述了如何获取 argparse 结果的字典。因此映射(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 包含至少 6 个元素,代表你不应该接触的内部 pyxb 东西。这就是我不太喜欢这个解决方案的原因之一。但这是我目前最好的。

于 2013-02-10T12:52:31.417 回答
0

在搜索了更多之后,我终于找到了我正在寻找的解决方案: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 回答