我正在写一个程序,我正在使用espeak库来让它说话。问题是我已经编写了我的程序,但现在我想在一开始就问用户,他是想让程序与他对话,还是仅仅依靠阅读。因此,如果他说是,程序使用espeak,但如果他说不,程序不使用espeak,那么我就被困在no部分了。
我想问一个问题,并根据答案使用正确的函数,但问题是它是一个本地函数,所以当您使用函数espeak()时,它会说
NameError: name 'espeak' is not defined 下面是我想要的:
import os
ai_talk = False
# MAKE THE AI SPEAK, OR NOT
def speak_or_not():
global ai_talk
speak_or_n = input("Do you want me to speak or not?\nPS: input Y/N\n").casefold()
while not ai_talk:
if (speak_or_n == "y") or (speak_or_n == "yes"):
def espeak(text):
command = 'espeak -v +f2 -p25 '+'"'+text+'"'
os.system(command)
return
ai_talk = True
elif (speak_or_n == "n") or (speak_or_n == "no"):
def espeak(text):
return
ai_talk = True
else:
speak_or_n = input("You can only input Y/N").casefold()
return
speak_or_not()
print("Hello there! how are you doing?")
espeak("Hello there! how are you doing?")那么有没有一种方法可以让def espeak()函数在全局级别上工作,这样我就可以在程序的其余部分使用它了呢?
(除了复制漏洞并将其粘贴到no部分,而不使用espeak函数)
发布于 2020-09-14 10:10:03
下面是如何编写它,使speak_or_not返回espeak函数。我添加了类型注释,以便更容易地看到内部函数如何与外部函数交互-- speak_or_not函数返回一个Callable[[str], None] (接受str参数并返回None的函数),两个版本的espeak都匹配此类型。
import os
from typing import Callable
def speak_or_not() -> Callable[[str], None]:
"""Return a function that either makes the AI speak or is a no-op."""
speak_or_n = input("Do you want me to speak or not?\nPS: input Y/N\n").casefold()
while True:
if speak_or_n in ("y", "yes"):
def espeak(text: str) -> None:
os.system(f'espeak -v +f2 -p25 "{text}"')
return espeak
if speak_or_n in ("n", "no"):
def espeak(text: str) -> None:
return
return espeak
speak_or_n = input("You can only input Y/N").casefold()
espeak = speak_or_not()
print("Hello there! how are you doing?")
espeak("Hello there! how are you doing?")请注意,global ai_talk不是必需的,因为这个值从未在函数外部使用过,事实上,在函数内部它只用于中断循环,如果在满足终止条件后使用return,则不需要该值,因此即使在函数内,也根本不需要该值。
发布于 2020-09-14 10:01:18
如果你只是简单的return espeak,你可以在主程序中保存你想要的定义。这就是Python装饰器的工作方式。下面是一个简单的例子:
def fpick(flag):
if flag:
def display():
print('flag was set')
else:
def display():
print('flag was off')
return display
display = fpick(True)
display()
display = fpick(False)
display()输出:
flag was set
flag was off
was set
flag已关闭
https://stackoverflow.com/questions/63877169
复制相似问题