我的问题很简单我该怎么做
global command
command = None
def user_commands():
def take_command():
try:
with sr.Microphone() as source:
print('listening...')
voice = listener.listen(source)
command = listener.recognize_google(voice)
command = command.lower()
if 'alexa' in command:
command = command.replace('alexa', '')
print(command)
except:
pass
return command
def run_alexa():
global command
command = user_commands()
...
if 'Play' in command:
...
当我这样做时发生的事情是: 类型错误:“NoneType”类型的参数不可迭代
我正在做的是创建一个 Alexa,它要求接受命令然后执行命令。命令的变量设置为等于人所说的,但在Python中,它不喜欢有一个没有类型的变量,所以我说不,然后说我会重新声明它,但它不起作用,
global 关键字可能具有欺骗性。它不用于声明全局变量,而是用于指示解释器在将来的变量引用中使用什么范围。让我尝试用另一种方式解释一下:
当你写
global command
时,你试图说“解释器,请创建一个名为command的全局变量”。但实际上 global command
实际上意味着“解释器,每当你在这个函数中看到一个名为 command 的变量时,你应该在全局范围内查找它”。
综上所述,您只需在全局范围内(在任何函数之外)定义变量即可。然后,所有想要访问这个全局变量的函数都应该包含表达式
global command
:
command = None
def user_commands():
...
...
return command
def run_alexa():
global command
command = user_commands()
我相信您对
global
的工作原理感到困惑。
global
只是说,当你在函数作用域内修改全局变量时,退出作用域后全局变量将会受到影响。
例如,您可以在 REPL 中尝试此操作:
>>> foo = "x"
>>>
>>> def bar():
... foo = "y"
...
>>> print(foo)
'x'
>>> bar()
>>> print(foo)
'x'
但是,如果您使用
global
关键字,则当您在函数中修改它时,它将被设置。
>>> foo = "x"
>>>
>>> def bar():
... global foo
... foo = "y"
...
>>> print(foo)
'x'
>>> bar()
>>> print(foo)
'y'
TL;DR:首先,您需要在某处(在全局范围内)声明全局变量。
在您的特定情况下,您的代码需要变为:
# declare command in the global namespace
command = None
def user_commands():
...
return command
def run_alexa():
# modify (pre-existing) global var
global command
command = user_commands()
该命令需要是一个全局变量,然后才能生效。