これら 2 種類のエラーの違いは何ですか? それらのそれぞれをいつ使用するのですか?
3 に答える
属性は、関数、クラス、またはモジュールのプロパティであり、プロパティが見つからない場合は が発生しattribute error
ます。
NameError
変数に関係しています。
>>> x=2
>>> y=3
>>> z #z is not defined so NameError
Traceback (most recent call last):
File "<pyshell#136>", line 1, in <module>
z
NameError: name 'z' is not defined
>>> def f():pass
>>> f.x=2 #define an attribue of f
>>> f.x
2
>>> f.y #f has no attribute named y
Traceback (most recent call last):
File "<pyshell#141>", line 1, in <module>
f.y
AttributeError: 'function' object has no attribute 'y'
>>> import math #a module
>>> math.sin(90) #sin() is an attribute of math
0.8939966636005579
>>> math.cosx(90) #but cosx() is not an attribute of math
Traceback (most recent call last):
File "<pyshell#145>", line 1, in <module>
math.cosx(90)
AttributeError: 'module' object has no attribute 'cosx'
ドキュメントから、テキストはかなり自明だと思います。
NameError ローカル名またはグローバル名が見つからない場合に発生します。これは、非修飾名にのみ適用されます。関連する値は、見つからなかった名前を含むエラー メッセージです。
AttributeError 属性参照 (属性参照を参照) または代入が失敗した場合に発生します。(オブジェクトが属性参照または属性割り当てをまったくサポートしていない場合、 TypeError が発生します。)
上記の例では、修飾されていない名前 (ローカルまたはグローバルのいずれか) にアクセスしようとしているときに、z
レイズへの参照を示しています。NameError
最後の例math.cosx
ではドット アクセス (属性参照) です。この場合は math モジュールの属性であるため、AttributeError
発生します。
以前に定義または割り当てられていない変数にアクセスしようとすると、Python によって名前が発生します。以前に割り当てられていない、または定義されていないインスタンスのインスタンス変数にアクセスしようとすると、AttributeError が発生します。
見る