微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您能以某种方式在python的全局级别上使用局部函数吗?

如何解决您能以某种方式在python的全局级别上使用局部函数吗?

我正在编写程序,并且正在使用espeak库来使其说话。问题是我已经编写了程序,但是现在我想让一种方法在开始时就问用户是希望程序与他交谈还是仅仅依靠阅读。因此,如果他说是,则该程序使用espeak讲话,但是如果他说没有,则该程序不使用espeak,所以我毫无用处。

我想问一个问题,并根据答案使用正确的函数,但是问题是它是局部函数,因此当您使用函数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()函数在全局级别上起作用,以便我可以在程序的其余部分中使用它?

(除了处理孔洞并将其粘贴到没有espeak函数的no节中)

解决方法

这里是编写方式,以使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则不需要一旦满足终止条件,那么即使在函数中也根本不需要该值。

,

如果只是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

没了

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。