因此,我一直在为这个问题而苦苦挣扎,直到现在为止(我对Python还是很陌生)。 我正在使用Python 3.7(由于我用于该项目的软件包版本不同,因此需要为3.7)来开发一个AI聊天机器人系统,该系统可以根据您的文本输入与您对话。该程序在启动时会读取一系列.yml文件的内容。在一个.yml文件中,我正在开发一种语法,用于当前5个字符与^ ### ^模式匹配时,它将代替执行代码并返回执行结果,而不仅仅是将文本输出给用户。例如:
普通对话:
- - What is AI?
- Artificial Intelligence is the branch of engineering and science devoted to constructing machines that think.
基于服务/代码的对话:
- - Say hello to me
- ^###^print("HELLO")
[想法是,当您要求它向您问好时,将从#.yml文件中检索^ ## ^ print(“ HELLO”)字符串,响应的前5个字符将被删除,响应将被发送到python代码中的一个单独的函数,它将在该代码中运行该代码并将结果存储到变量中,该变量将从该函数返回的变量中,该变量将为用户提供美观,清晰的HELLO结果。我意识到这可能很难遵循,但是一旦解决了整个错误,我将整理代码并压缩所有内容。附带说明:Oracle就是我所说的项目。我并不是想将Java编织成一团糟。
问题不会像应有的那样将正在运行/执行/求值的代码存储在变量中。
我的代码:
def executecode(input):
print("The code to be executed is: ",input)
#note: the input may occasionally have single quotes and/or double quotes in the input string
result = eval("{}".format(input))
print ("The result of the code eval: ", result)
test = eval("2+2")
test
print(test)
return result
@app.route("/get")
def get_bot_response():
userText = request.args.get('msg')
print("Oracle INTERPRETED input: ", userText)
ChatbotResponse = str(english_bot.get_response(userText))
print("CHATBOT RESPONSE VARIABLE: ", ChatbotResponse)
#The interpreted string was a request due to the ^###^ pattern in front of the response in the custom .yml file
if ChatbotResponse[:5] == '^###^':
print("---SERVICE REQUEST---")
print(executecode(ChatbotResponse[5:]))
interpreter_response = executecode(ChatbotResponse[5:])
print("Oracle RESPONDED with: ", interpreter_response)
else:
print("Oracle RESPONDED with: ", ChatbotResponse)
return ChatbotResponse
当我运行此代码时,这是输出:
Oracle INTERPRETED input: How much RAM do you have?
CHATBOT RESPONSE VARIABLE: ^###^print("HELLO")
---SERVICE REQUEST---
The code to be executed is: print("HELLO")
HELLO
The result of the code eval: None
4
None
The code to be executed is: print("HELLO")
HELLO
The result of the code eval: None
4
Oracle RESPONDED with: None
Output on the website interface
基本上,对于“代码eval:的结果:”输出,需要说HELLO。这应该可以使聊天机器人在Web界面中使用HELLO进行响应,这是此处的最终目标。在“要执行的代码为:”输出文本之后,由于HELLO的缘故,它似乎正在执行代码。它只是不像我需要的那样将其存储到变量中。
[我已经尝试过 eval,exec,ast.literal_eval(),使用str()将输入转换为字符串,更改单引号和双引号,将\放在引号对之前,以及其他一些操作。每当我到达程序执行代码时解释“ print(“ HELLO”)“的位置时,就会抱怨语法。另外,从几天的在线观察中,我发现由于一系列问题,exec和eval通常并不受欢迎,但是我现在真的不在乎,因为我在尝试做出一些可行的事情,然后再尝试做点好事,行之有效的事。我觉得问题是像过去一样小而愚蠢的,但是我不知道这可能是什么。 :(
我将这两个资源用作整个聊天机器人项目的基础:
[此外,对于冗长和描述性的问题,我感到抱歉。我很少在stackoverflow上问自己一个问题,因为如果我有问题,通常已经有了一个很好的答案。感觉到我现在已经尝试了一切。如果您对如何使用整个系统有更好的建议,或者您认为我应该尝试以其他方式进行处理,那么我欢迎您提出意见。
谢谢您的任何/所有帮助。非常感谢!:)
问题是python的print()
没有返回值,这意味着它将始终返回None
。 eval
简单地计算某些表达式,然后从该表达式返回返回值。由于print()
返回None
,因此某些打印语句的eval
也将返回None
。
很容易进行转换,尝试创建一个新列表并将该变量的更新值添加到其中,例如: