回答:
基本的には、オブジェクトが__getitem__()
メソッドを実装することを意味します。つまり、「コンテナ」であるオブジェクトを表します。つまり、他のオブジェクトが含まれています。これには、文字列、リスト、タプル、および辞書が含まれます。
[
... ]
インデックスの構文が呼び出される添字それが実際の添字を使用して数学的表記法と同等だから、。たとえばa[1]
、数学者がa₁と書くもののPythonです。したがって、「下付き可能」は「下付き可能」を意味します。これは、Pythonの用語で、それを実装する必要がありますを意味__getitem__()
するので、a[1]
のためだけ糖衣構文ですa.__getitem__(1)
。
スクリプト可能なオブジェクトは、オブジェクトに対して行われた操作を記録するオブジェクトであり、再生可能な「スクリプト」として保存できます。
さて、Alistairが彼が何を尋ねたかわからず、実際に(他の人が編集した)「下付き可能」オブジェクトを意味した場合、(mipadiも回答したように)これは正しいものです。
添え字付きオブジェクトは、__getitem__
特別なメソッド(リスト、辞書など)を実装するオブジェクトです。
コンピューティングにおける添え字の意味は次のとおりです。「配列の要素の1つを指定するために、単独でまたは他のプログラムと共にプログラムで使用される記号(概念的には添え字として記述されますが、実際には通常は使用されません)。」
さて、次の簡単な例で @ user2194711では、2つの理由により、追加要素をリストの一部にすることができないことがわかります。
1)実際にはメソッドappendを呼び出していません。必要だから()
を呼び出すです。
2)エラーは、関数またはメソッドに添字を付けることができないことを示しています。リストやシーケンスのようにインデックス付けできないことを意味します。
これを見てください:-
>>> var = "myString"
>>> def foo(): return 0
...
>>> var[3]
't'
>>> foo[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable
つまり、下付き文字やsay要素はありません function
。それらはシーケンスで発生するようなものです。の助けを借りて、私たちのようにそれらにアクセスすることはできません[]
。
また; mipadiは彼の答えに言いました。基本的には、オブジェクトが__getitem__()
メソッドを実装することを意味します。(下付き可能な場合)。したがって、生成されたエラー:
arr.append["HI"]
TypeError: 'builtin_function_or_method'オブジェクトは下付きではありません
私も同じ問題を抱えていました。やっていた
arr = []
arr.append["HI"]
そのため、使用する[
とエラーが発生しました。そのはずarr.append("HI")
ここでの以前の回答の当然の結果として、これは多くの場合、持っていないときにリスト(またはdictまたは他の添え字付きオブジェクト)があると考える兆候です。
たとえば、リストを返す関数があるとします。
def gimme_things():
if something_happens():
return ['all', 'the', 'things']
次に、その関数を呼び出し、something_happens()
何らかの理由でTrue
値が返されない場合、どうなりますか?if
失敗し、あなたが通って落下します。gimme_things
明示的にはreturn
何も行いません。つまり、実際には暗黙的に行われreturn None
ます。次に、このコード:
things = gimme_things()
print("My first thing is {0}".format(things[0]))
「NoneType
オブジェクトは添え字なしではありません」で失敗します。なぜなら、そうでthings
ありNone
、そうしようとしてNone[0]
いるので、エラーメッセージの内容が意味をなさないからです。
コードのこのバグを修正する方法は2つあります。1つ目はthings
、使用する前に実際に有効かどうかを確認してエラーを回避する方法です。
things = gimme_things()
if things:
print("My first thing is {0}".format(things[0]))
else:
print("No things") # or raise an error, or do nothing, or ...
または同等にTypeError
例外をトラップします。
things = gimme_things()
try:
print("My first thing is {0}".format(things[0]))
except TypeError:
print("No things") # or raise an error, or do nothing, or ...
もう1つは、gimme_things
常にリストを返すように再設計することです。この場合、同様のバグが発生している場所が多数ある場合でも、それらを単純かつ慣用的に保つことができるため、これはおそらくより単純な設計です。
def gimme_things():
if something_happens():
return ['all', 'the', 'things']
else: # make sure we always return a list, no matter what!
logging.info("Something didn't happen; return empty list")
return []
もちろん、else:
ブランチに何を入れるかは、ユースケースによって異なります。おそらく、something_happens()
失敗したときに例外を発生させて、どこかで実際に問題が発生した場所をより明確かつ明確にする必要がありますか?独自のコードに例外を追加することは、何かが失敗したときに何が起きているかを正確に知らせるための重要な方法です!
(通知はまた、どのようにこの後者の修正は、まだ完全にバグを修正しない-それは添字しようとするからあなたを防ぐことNone
が、things[0]
まだあるIndexError
ときthings
、空のリストがあるあなたが持っている場合。try
あなたが行うことができますexcept (TypeError, IndexError)
あまりにも、トラップにそれを。)
hasattr(SomeClassWithoutGetItem, '__getitem__')
添え字が付けられるかどうかを決定するには?