如何进一步传递kwargs?

时间:2017-10-02 09:52:00

标签: python python-3.x wms kwargs

我在OWSLib中有一个使用kwargs的外部函数wms130.getfeatureinfo

def getfeatureinfo(self, layers=None,
...
                       method='Get',
                       timeout=None,
                       **kwargs
                       ):

我在内部函数wms130.__build_getmap_request中使用了kwargs:

    ...
    request['transparent'] = str(transparent).upper()
    request['bgcolor'] = '0x' + bgcolor[1:7]
    request['exceptions'] = str(exceptions)

    if time is not None:
        request['time'] = str(time)

    if elevation is not None:
        request['elevation'] = str(elevation)

    # any other specified dimension, prefixed with "dim_"
    for k, v in six.iteritems(dimensions):
        request['dim_' + k] = str(v)

    if kwargs:
        for kw in kwargs:
            request[kw]=kwargs[kw]
    return request

显然,作者的意图是将所有密钥参数放入HTTP查询的参数中。

不幸的是,当我将我的kwarg传递给外部函数时,它有一个值

{'MAXCC': '100'}

但是当达到这个内部代码时,它有一个值

{'kwargs': {'MAXCC': '100'}}

即。额外的水平增加。这是因为使用

调用内部函数
# GetMap-Request
        request = self.__build_getmap_request(
            layers=layers,
            styles=styles,
            srs=srs,
            bbox=bbox,
            dimensions=dimensions,
            elevation=elevation,
            format=format,
            size=size,
            time=time,
            transparent=transparent,
            bgcolor=bgcolor,
            exceptions=exceptions,
            kwargs=kwargs)

即。外部kwargs包含在名为kwargs的单个keyworded参数中。

问题是双重的:

1)OWSLib中的bug是多么可能,并且意图是扩展kwargs? (我会说它是99%,因为没有必要添加循环来迭代字典和单个已知条目)

2)如何在Python中调用内部函数使kwargs作为kwargs传递,而不是单个条目?

1 个答案:

答案 0 :(得分:1)

使用解压缩进一步传递先前的kwargs。不要为它引入新的关键字参数:

request = self.__build_getmap_request(
            ...
            exceptions=exceptions,
            **kwargs)

所有这些关键字参数和解压缩的kwargs都将在下一级kwargs中捕获。

更多的是,请求dict可以使用简单的dict.update更新,而不是循环:

request.update(kwargs)