[英]NameError: function definitions vs. class/dictionary definitions in python
感謝@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!
但這在類定義中引用了變量的情況下失敗了:
#module.py
class ClassScope():
var = global_var
def print_global():
var = ClassScope.var
print var
global_var = "Here I am!"
#shell
>>> from module import print_global
NameError: name 'global_var' is not defined
這意味着在導入時將“執行” class ClassScope()
定義。 相比之下,在def function_scope()
時(即,后導入,因此該函數可以訪問模塊的整個全局范圍),將“執行” def function_scope()
定義。
再次感謝。
我最初試圖實現一個接受類名並返回該類對象的函數。 但是一路上我意識到我對屬性范圍並不掌握。 (或者問題可能是可變壽命 ?)
為什么下面的工作...
#module.py
def create_object(class_name):
classes = {
'ClassA':ClassA,
}
return classes[class_name]()
class ClassA(object):
pass
#script.py
from module import create_object
obj = create_object('ClassA')
...但這失敗了嗎?
#module.py
CLASSES = {
'ClassA':ClassA,
}
def create_object(class_name):
return CLASSES[class_name]()
class ClassA(object):
pass
#script.py
from module import create_object
obj = create_object('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
看起來ClassA
不在范圍內,因為第二個示例在CLASSES
詞典中對其進行了引用。 但是,如果是這種情況,為什么在第一個示例中可以在create_object()
中看到它?
非常感謝您對此有所幫助。 非常感謝!
這與發生名稱查找而不是范圍有關。 當執行使用標識符的代碼時,Python僅嘗試將標識符與對象或類相關聯。 在第一個代碼段,該名稱ClassA
在create_object
僅被分配一個時意思create_object()
通過該時間被執行, class ClassA
創建定義ClassA
已經被執行。 在第二代碼片段,您要執行的是指代碼ClassA
前ClassA
,甚至被定義,從而創造一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.