传递函数参数(元组内的字典)
Pass function argument (dict inside a tuple)
我正在编写一个函数来生成 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"}))
这将return
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'})
但是上面的代码returns是什么
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
的元素?
您可以使用您的索引:
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'}]
我正在编写一个函数来生成 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"}))
这将return
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'})
但是上面的代码returns是什么
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
的元素?
您可以使用您的索引:
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'}]