Python 具有不同api输入参数的函数调用每次返回相同的输出,即Flask api
我有一个返回向量的函数Python 具有不同api输入参数的函数调用每次返回相同的输出,即Flask api,python,python-3.x,function,api,flask,Python,Python 3.x,Function,Api,Flask,我有一个返回向量的函数 def class_vector(*categories): all_categories = categories model = Word2Vec.load(r"C:\Users\vector.model") my_dict = dict({}) for idx, key in enumerate(model.wv.vocab): my_dict[key] = model.wv[key]
def class_vector(*categories):
all_categories = categories
model = Word2Vec.load(r"C:\Users\vector.model")
my_dict = dict({})
for idx, key in enumerate(model.wv.vocab):
my_dict[key] = model.wv[key]
categories_vectors = dict({})
for i in all_categories:
if i.lower() in my_dict.keys():
categories_vectors[i] = my_dict[i]
average_vector = np.mean(list(categories_vectors.values()), axis =0)
average_vector = average_vector.reshape(1, -1)
return average_vector
现在我调用此函数并测试为2种不同输入组合生成的向量:
test 1 = class_vector("apple", "banana")
test 2 = class_vector("grapes", "papaya", "lemon")
这非常有效,并为每个新的水果组合返回一个新的向量。上述函数位于名为vectors_list.py的.py文件中
现在我想构建一个api,它将水果名称作为用户的输入,并使用class\u vector
函数返回计算出的向量
Api代码:
from flask import Flask, request
from vector_list import class_vector
app = Flask(__name__)
@app.route('/')
def status():
fruits = request.args.getlist("param")
str_fruits = ",".join(fruits)
returned_vec = class_vector(*str_fruits )
return str(returned_vec)
现在我从cmd运行flask
&运行一些测试
Test 1: `curl "http://localhost:5000?param=apple¶m=banana"`
Test 2: `curl "http://localhost:5000?param=grapes¶m=papaya¶m=lemon"`
这将为每个新的水果组合返回相同的向量,我将其作为param发送以调用api。这是错误的,我想理解为什么会发生这种情况。我没有正确调用函数吗?任何建议您不需要加入从
request.args.getlist
返回的字符串列表。移除str_fruits=“,”。加入(fruits)
并使用类向量(*fruits)
:
@app.route(“/”)
def状态():
水果=request.args.getlist('param')
返回的向量=类向量(*fruits)
返回str(返回的向量)
请注意,您的
class\u vector
函数接受变量参数def class\u vector(*类别):
,并期望收到一组参数。现在,当你加入时,你最终会调用类向量,如下所示:类向量('a','p','p','l','e','e','b','a','n','a','n','a')
而不是类向量('apple','banana')
。之所以会出现这种情况,是因为使用*str_-fruits
可以将字符串解压为一组字符。为什么要执行str_-fruits=“,”。join(fruits)
?将其转换为字符串,因为request.args.getlist返回一个列表,并且函数类_-vector只接受字符串输入您在fruits
中已经有一个字符串列表,因此,您可以在下一个调用中使用它:class\u vector(*fruits)
。哇!成功了。非常感谢你。你能告诉我为什么str_fruits=“,”。join(fruits)
每次发布详细信息作为答案时都让函数返回相同的输出。这非常有效,但我仍然无法理解为什么。如果我只是从api返回str(fruits)
,我将得到类似这样的输出['apple','banana']。如果我通过创建一个新对象直接尝试将此输出传递给我的class_向量函数test3=class_向量([“apple”,“banana”])
,这将返回一个错误,因此我使用了str_fruits=“,”。join(fruits)
将[“apple”,“banana”]
转换为逗号分隔的字符串,将其传递给class_向量函数。你能解释一下,当我返回[code>时,列表括号是如何不引起问题的吗?返回的[u vec=class\u vector(*fruits)
我现在明白了str\u fruits=“,”。join(fruits)
是错误的,因为它形成了一个字符串,但我想知道class\u vector函数是如何将[“apple”,“banana”]
处理为class\u vector的(“苹果”、“香蕉”)
来自apicall@Erich调用class\u vector(*str\u fruits)
时,您将解包str\u fruits
。是否看到*
?这意味着任何集合(列表或字符串)将被拆分为单独的部分,并作为单独的参数传递给class\u vector
@Erich。看起来是这样的。请查看Python中的参数解包机制。这里有一组示例:。非常感谢。此示例回答了我的问题