簡體   English   中英

NameError:函數定義與python中的類/字典定義

[英]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()定義。

  1. 我總體上是否在正確考慮? “執行”函數/類定義的概念對我來說似乎很奇怪。
  2. 為什么函數定義和類定義之間存在差異?
  3. 有沒有一種方法可以推遲執行類定義,即使其表現得像一個函數,從而使它可以訪問成功導入后將存在的整個模塊范圍?

再次感謝。

原始問題

我最初試圖實現一個接受類名並返回該類對象的函數。 但是一路上我意識到我對屬性范圍並不掌握。 (或者問題可能是可變壽命 ?)

為什么下面的工作...

#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僅嘗試將標識符與對象或類相關聯。 在第一個代碼段,該名稱ClassAcreate_object僅被分配一個時意思create_object()通過該時間被執行, class ClassA創建定義ClassA已經被執行。 在第二代碼片段,您要執行的是指代碼ClassAClassA ,甚至被定義,從而創造一個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM