首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >您能在python中以某种方式在全局级别上使用本地函数吗?

您能在python中以某种方式在全局级别上使用本地函数吗?
EN

Stack Overflow用户
提问于 2020-09-14 09:54:02
回答 2查看 52关注 0票数 1

我正在写一个程序,我正在使用espeak库来让它说话。问题是我已经编写了我的程序,但现在我想在一开始就问用户,他是想让程序与他对话,还是仅仅依靠阅读。因此,如果他说是,程序使用espeak,但如果他说不,程序不使用espeak,那么我就被困在no部分了。

我想问一个问题,并根据答案使用正确的函数,但问题是它是一个本地函数,所以当您使用函数espeak()时,它会说

代码语言:javascript
运行
复制
NameError: name 'espeak' is not defined 

下面是我想要的:

代码语言:javascript
运行
复制
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函数)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-14 10:10:03

下面是如何编写它,使speak_or_not返回espeak函数。我添加了类型注释,以便更容易地看到内部函数如何与外部函数交互-- speak_or_not函数返回一个Callable[[str], None] (接受str参数并返回None的函数),两个版本的espeak都匹配此类型。

代码语言:javascript
运行
复制
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,则不需要该值,因此即使在函数内,也根本不需要该值。

票数 1
EN

Stack Overflow用户

发布于 2020-09-14 10:01:18

如果你只是简单的return espeak,你可以在主程序中保存你想要的定义。这就是Python装饰器的工作方式。下面是一个简单的例子:

代码语言:javascript
运行
复制
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()

输出:

代码语言:javascript
运行
复制
flag was set
flag was off

 was set
flag

已关闭

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63877169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档