当我尝试调用函数时为什么会出现NameError错误?

3

这是我的代码:

import os

if os.path.exists(r'C:\Genisis_AI'):
    print("Main File path exists! Continuing with startup")
else:
    createDirs()

def createDirs():
    os.makedirs(r'C:\Genisis_AI\memories')

当我执行此操作时,它会抛出一个错误:
File "foo.py", line 6, in <module>
    createDirs()
NameError: name 'createDirs' is not defined

我确认没有拼写错误或错过函数名,为什么还会出现 NameError 错误?


这个回答解决了你的问题吗?Python NameError: name is not defined - Georgy
1个回答

10

如果你还没有定义一个函数,那么你就不能调用它。将 def createDirs(): 块移到你的文件顶部,在导入语句下面。

有些语言允许在定义函数之前使用它们,比如JavaScript将其称为“提升”。但Python不是这些语言之一。


请注意,只要定义出现在使用之前(按时间顺序),即使引用了该函数所在行之前的代码,也是允许的。例如,以下代码是可以接受的:

import os

def doStuff():
    if os.path.exists(r'C:\Genisis_AI'):
        print("Main File path exists! Continuing with startup")
    else:
        createDirs()

def createDirs():
    os.makedirs(r'C:\Genisis_AI\memories')

doStuff()

尽管在第7行调用了createDirs(),而它的定义在第9行,但这并不是问题,因为def createDirs会在doStuff()在第12行执行前先执行。


啊,谢谢,这是我犯的一个愚蠢的错误。我以前从来没有遇到过这个问题(至少我认为我经常会这样做),并且从未面临过这个问题,感谢Kevin的帮助。不过看到你在JavaScript上的评论(我也用Python编程),我可能把它们混淆了。 - NaruS
@NaruS 如果这个答案解决了你的问题,请考虑给它点赞并将其接受为正确答案。https://stackoverflow.com/help/someone-answers - Aaron
我必须等到时间限制,但我已经点赞了。实际上,我在看到它后就立即点赞了。(发布问题后必须等待7分钟才能接受答案作为正确答案,这就是接受延迟的原因) - NaruS
1
请注意,在全局调用函数和从另一个函数中调用函数之间存在巨大的区别,@NaruS。您可能已经多次在没有问题的情况下执行了后者。 - Code-Apprentice
@Code-Apprentice 感谢您的留言,这是我以前做过并熟悉的事情,通常不会出现问题,也不是我的初衷(正如Aaron所说,我有意尝试在调用函数后定义它,就像在JavaScript中一样[我也使用这种语言进行脚本编写],并没有意识到Python的工作方式不同)。无论如何,感谢您的提醒,我会记住的。 - NaruS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接