@abay111

TypeError: 'in ' requires string as left operand, not tuple; как исправить?

import speech_recognition as sr
import os
import sys
import webbrowser
import pyttsx3
import pyowm
import datetime
import time
owm = pyowm.OWM('f58349d7f89f82766b104bc8b3f318b1',language='ru')
cmds = {
"ctime": ('текущее время','сейчас времени', 'который час'),
"radio": ('включи музыку', 'воспроизведи радио', 'включи радио'),
"stupid1": ('расскажи анекдот', 'рассмещи меня', 'ты знаешь анекдот')
}

engine = pyttsx3.init()
def talk(words):
print(words)
engine.say(words)
engine.runAndWait()
talk('Здравствуйте, попросите что-нибудь : ')

def commands():
r = sr.Recognizer()

with sr.Microphone() as source:
print('Говорите : ')
r.pause_threshold = 0.5
r.adjust_for_ambient_noise(source, duration=1)
audio = r.listen(source)
try:
exersize = r.recognize_google(audio, language="ru-Ru").lower()
talk('Вы сказали : ' + exersize)
except sr.UnknownValueError:
talk('Я вас не поняла ')
exersize = commands()

return exersize

def makeSomeThing(exersize):
if 'открой гугл' in exersize:
talk('Сию минуту' )
url = 'https://www.google.com/'
webbrowser.open(url)
elif 'имя' in exersize:
talk('Меня зовут Данелия')
elif cmds["ctime"] in exersize:
now = datetime.datetime.now()
talk("Сейчас " + str(now.hour) + ':' + str(now.minute))
elif 'топ' in exersize:
talk('Да, конечно')
sys.exit()
elif 'погода' in exersize:

talk('Скажите город в котором хотите узнать погоду: ')
r = sr.Recognizer()
with sr.Microphone() as source1:
audio = r.listen(source1)
nameOFcity = r.recognize_google(audio, language="ru-Ru").lower()
observation = owm.weather_at_place(nameOFcity)
w = observation.get_weather()
temp = w.get_temperature('celsius')["temp"]
talk(' В городе ' + str(nameOFcity) + ' сейчас ' + w.get_detailed_status() + '\n')
talk('Температура в районе ' + str(temp) + '\n\n' + 'градусов')
elif 'что ты умеешь' in exersize:
talk('Я умею говорить время, открывать сайты, знаю погоду и пока я на стадии разроботки. ха-ха')
elif 'анекдот' in exersize:
talk('Страшные времена. Людям приходится мыть руки, готовить дома еду и общаться со своими детьми. Так может дойти и до чтения книг.')

while True:
makeSomeThing(commands())
  • Вопрос задан
  • 236 просмотров
Решения вопроса 1
phaggi
@phaggi
лужу, паяю, ЭВМы починяю
строка
elif cmds["ctime"] in exersize:
берет из словаря
cmds = {
"ctime": ('текущее время','сейчас времени', 'который час'),
"radio": ('включи музыку', 'воспроизведи радио', 'включи радио'),
"stupid1": ('расскажи анекдот', 'рассмещи меня', 'ты знаешь анекдот')
}

значение по ключу "ctime"
Это значение представляет собой tuple (в круглых скобках - tuple), это не список, это именно tuple - кортеж. Это такая структура, она неизменная в отличие от списка.
И получается, что строка
elif cmds["ctime"] in exersize:
пытается выяснить, присутствует ли кортеж в "exersize".
Но метод in не умеет искать кортежи где-то, умеет только строки.
Поэтому, видимо, надо брать кортеж, содержащий несколько отдельных строк, перебирать его элементы и каждый элемент искать в "exersize".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы