传递函数参数(元组内的dict)

2024-05-15 11:15:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个函数来生成一个API url,它接受多个参数并复制字符串的一部分。短版本(只接受变量Val的一个值)如下所示

def get_url(par,att,value, _filter):

    base_url='''https://mytest.com/api/Test/'''+str(par)+'''?size=100000&filters=['''
    url = base_url + '''{"VarA" : "'''+att+'''", "Val":["'''+value+'''"], "VarB":"'''+_filter+'''"}]'''

    return url


print(get_url('Sales',{'Year':['2020'] , "Time"}))

这会回来的

https://mytest.com/api/Test/Sales?size=1000&filters=[{"VarA" : "Year", "Val":["2020"], "VarB":"Time"}]

我编写了另一个函数,以便可以为Val传递多个变量,同时还可以使用下面的函数复制过滤器字符串

def get_url(par,argv=None, _filter=None):
    if argv:
        att=argv
        url='''https://mytest.com/api/Test/'''+str(par)+'''?size=100000&filters=['''
        i=0
        for key in att.keys():
            attribute=key
            attribute_value=att[attribute]
            my_lst_str = '","'.join(map(str, attribute_value))
            values= '"'+my_lst_str+'"'
            if i==0:
                url=url+'''{"VarA" : "'''+attribute+'''", "Val":['''+value+'''], "VarB":'''+str(_filter)+'''}]'''
            else:url=url+''',{"VarA" : "'''+attribute+'''", "Val":['''+value+'''], "VarB":'''+str(_filter)+'''}]'''
            i+=1

    else:
        url = #Some string#

    return url


url = get_url('Sales',{'Loc':['USA','CAN'],'Year':["2016","2017"]},{'Country','Time'})

但是上面的代码返回的是

https://mytest.com/api/Test/Sales?size=1000&filters=[{"VarA" : "Loc", "Val":["USA","CAN"], "VarB":"{'Country', 'Time'}"}],{"VarA" : "Year", "Val":["2016","2017"], "VarB":"{'Country', 'Time'}"}]

我的预期产出是

https://mytest.com/api/Test/Sales?size=1000&filters=[{"VarA" : "Loc", "Val":["USA","CAN"], "VarB":"Country"},{"VarA" : "Year", "Val":["2020","2017"], "VarB":"Time"}]

如何隔离VarB的元素


Tags: httpstestcomapiurltimevalueattribute
2条回答

您可以使用索引:

from collections import OrderedDict
def get_url(par, argv=None, _filter=None):
    obj_list, obj_filter = [], list(_filter)
    if argv:
        att = argv
        url = (
            """https://mytest.com/api/Test/""" + str(par) + """?size=100000&filters="""
        )
        i = 0
        for key in att.keys():
            attribute = key
            attribute_value = att[attribute]
            obj_list.append({"VarA" : attribute, "Val": attribute_value, "VarB": obj_filter[i]})
            i += 1

    else:
        url = "some url"

    return url+str(obj_list)


url = get_url(
    "Sales", OrderedDict({"Loc": ["USA", "CAN"], "Year": ["2016", "2017"], "wewe": ["4", "5"]}), {"Country", "Time", "wre"}
)
print(url)

输出:

https://mytest.com/api/Test/Sales?size=100000&filters=[{'VarA': 'Loc', 'Val': ['USA', 'CAN'], 'VarB': 'wre'}, {'VarA': 'Year', 'Val': ['2016', '2017'], 'VarB': 'Time'}, {'VarA': 'wewe', 'Val': ['4', '5'], 'VarB': 'Country'}]

请注意:集合中元素的顺序是未定义的,尽管它可能由各种元素组成。通过将set转换为list您无法确保顺序保持不变

>>> li = list({"Country", "Time", "w", "z"})
>>> li
['z', 'Country', 'w', 'Time']

问题中的代码也不能正常运行

我的答案是基于您预期的输出,并且我没有考虑边缘情况,我强烈建议更改函数参数。此外,我认为_filter是一个列表["Country", "Time"]

def get_url(par, att=None, _filter=None):
    url = f"https://mytest.com/api/Test/{par}?size=100000&filters="
    if att:
        result_list = [{'VarA':k, 'Val':v} for k , v in att.items()]
    else: return "some string"  

    if _filter:
        _filter.reverse()
        for d in result_list:
            d["VarB"] = _filter.pop()
    return f"{url}{result_list}"

url = get_url(
    "Sales", {"Loc": ["USA", "CAN"], "Year": ["2016", "2017"], "wewe": ["4", "5"]}, ["Country", "Time", "wre"]
)
print(url)

# https://mytest.com/api/Test/Sales?size=100000&filters=[{'VarA': 'Loc', 'Val': ['USA', 'CAN'], 'VarB': 'Country'}, {'VarA': 'Year', 'Val': ['2016', '2017'], 'VarB': 'Time'}, {'VarA': 'wewe', 'Val': ['4', '5'], 'VarB': 'wre'}]

相关问题 更多 >