寻求有关如何防止Python中无情的"NameErrors"的一般建议

use*_*876 3 python namespaces function

我有一个问题,我确信在某些时候,每个中级Python程序员都会想到这个问题:也就是说,如何修复/阻止/避免/解决那些永远存在且同样令人沮丧的问题NameErrors.我不是在谈论实际错误(如拼写错误等),而是一个基本上没有定义全局名称的奇怪问题,而实际上它是进一步定义的.无论出于何种原因,Python似乎在这个领域非常需要:每个变量绝对肯定必须在上面定义并且只在引用它的任何东西之上(或者看起来如此).

例如:

condition = True

if condition == True:
    doStuff()

def doStuff():
    it_worked = True
Run Code Online (Sandbox Code Playgroud)

让Python给我这个:

Traceback (most recent call last):
  File "C:\Users\Owner\Desktop\Python projects\test7.py", line 4, in <module>
    doStuff()
NameError: name 'doStuff' is not defined
Run Code Online (Sandbox Code Playgroud)

但是,WAS定义了这个名称,而不是Python显然想要它的地方.所以对于一个俗气的小功能来说,doStuff()这没什么大不了的; 只需将功能剪切并粘贴到满足系统对特定订单要求的区域即可.但是当你尝试用它来实际设计一些东西时,它几乎不可能组织代码(我必须"解组"大量的代码来容纳这个bug).我从来没有遇到过我写过的任何其他语言的问题,所以它似乎特定于Python ...但无论如何我在文档中研究了这个并且没有找到任何解决方案(甚至是潜在的导致可能的解决方案)所以我会感谢任何提示,技巧,变通方法或其他建议.

它可能就像学习特定的组织结构一样简单(比如某种"Pythonic"和非常具有战略性的解决方法),或者只是使用大量import语句,因此组织特定组织结构会更容易令系统不能起作用的命令......

mil*_*ose 5

避免在顶层编写代码(声明除外),main()在要直接执行的文件中使用函数:

def main():
    condition = True
    if condition:
        do_stuff()

def do_stuff():
    it_worked = True

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

这样,你只需要确保if..main结构如下main()功能(例如,将其放置在文件的结尾),其余的可以按任何顺序排列.执行时,文件将被完全解析(因此可以解析模块中定义的所有名称)main().