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&param=banana"`
Test 2: `curl "http://localhost:5000?param=grapes&param=papaya&param=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中的参数解包机制。这里有一组示例:。非常感谢。此示例回答了我的问题