NameError:python中的函数定义与类/字典定义 更新

NameError:python中的函数定义与类/字典定义 更新,python,python-2.7,Python,Python 2.7,感谢@jwodder在下面的回复,我逐渐明白了这一点 下面是一个仍然让我困惑的简化示例: 在函数定义中引用后续定义的变量时,此函数运行良好: #module.py def function_scope(): var = global_var return var def print_global(): var = function_scope() print var global_var = "Here I am!" #shell: >>>

感谢@jwodder在下面的回复,我逐渐明白了这一点

下面是一个仍然让我困惑的简化示例:

在函数定义中引用后续定义的变量时,此函数运行良好:

#module.py
def function_scope():
    var = global_var
    return var

def print_global():
    var = function_scope()
    print var

global_var = "Here I am!"

#shell:
>>> from module import print_global
>>> print_global()
Here I am!
但是,在类定义中引用变量的情况下,此操作失败:

这意味着导入时将“执行”类ClassScope()定义。相反,调用函数时(即导入后,因此函数可以访问模块的整个全局范围),
def function\u scope()
定义被“执行”

  • 总的来说,我的想法正确吗?“执行”函数/类定义的概念对我来说似乎很奇怪
  • 为什么函数定义和类定义之间存在这种差异
  • 是否有办法推迟类定义的执行,即使其行为类似于函数,从而允许其访问成功导入后将存在的整个模块范围
  • 再次感谢

    原始问题 我最初尝试实现一个函数,该函数接受类名并返回该类的对象。但是一路上我意识到我对属性范围没有很好的掌握。(或者问题可能是可变寿命?)

    为什么下面的工作

    #module.py
    定义创建对象(类名称):
    类别={
    “ClassA”:ClassA,
    }
    返回类[类名称]()
    类别A(对象):
    通过
    #script.py
    从模块导入创建_对象
    obj=创建对象('ClassA')
    
    。。。但这失败了

    #module.py
    类别={
    “ClassA”:ClassA,
    }
    定义创建对象(类名称):
    返回类[类名称]()
    类别A(对象):
    通过
    #script.py
    从模块导入创建_对象
    obj=创建对象('ClassA')
    
    例外情况如下:

    Traceback (most recent call last):
      File "script.py", line 2, in <module>
        from module import create_object
      File ".../module.py", line 3, in <module>
        'ClassA':ClassA,
    NameError: name 'ClassA' is not defined
    
    回溯(最近一次呼叫最后一次):
    文件“script.py”,第2行,在
    从模块导入创建_对象
    文件“../module.py”,第3行,在
    “ClassA”:ClassA,
    NameError:未定义名称“ClassA”
    
    看起来
    ClassA
    不在范围内,因为它在第二个示例中的
    CLASSES
    字典中被引用。但是,如果是这样的话,为什么在第一个示例中它从
    create\u object()
    中可见


    非常感谢您对理解这一点的任何帮助。非常感谢

    这与名称查找发生的点有关,而不是范围。Python仅在执行使用标识符的代码时才尝试将标识符与对象或类关联。在第一个代码段中,
    create\u object
    中的名称
    ClassA
    仅在执行
    create\u object()
    时才被赋予一个含义,此时创建
    ClassA
    ClassA
    定义已经执行。在第二个代码段中,您试图在定义
    ClassA
    之前执行引用
    ClassA
    的代码,从而创建了一个错误。

    哦,有趣!根据您的回复,我将全局
    字典定义移动到代码段2中module.py的底部。这就行了。但是,为什么
    类A
    定义从snippet#1中的
    create_object()
    函数内部引用时被视为“已经执行过”呢?我想我被你回答中的短语“当使用该标识符的代码被执行时”弄糊涂了。如果声明的顺序在代码段#2中很重要,为什么在代码段#1中不重要?或者我的意思是问:
    类A
    定义什么时候执行?@tino:解析器一遇到
    类A
    定义就立即执行(粗略地说)。请注意,当遇到
    create\u对象
    定义时,函数体与名称
    create\u对象
    关联,在调用
    create\u对象()
    之前,不会执行函数体中的实际代码。这类似于在函数中使用全局变量:函数将在调用函数时使用变量的值,而不是在定义函数时。啊,好的。因此函数的工作方式不同,函数的内容在函数被调用之前不会被解析。而类定义(和字典定义)的内容在导入时被完全解析(即“执行”)。非常感谢@jwodder,谢谢你帮助我理解!非常感谢。
    Traceback (most recent call last):
      File "script.py", line 2, in <module>
        from module import create_object
      File ".../module.py", line 3, in <module>
        'ClassA':ClassA,
    NameError: name 'ClassA' is not defined