Pythonオブジェクトが「添え字付き」かどうかはどういう意味ですか?


回答:


357

基本的には、オブジェクトが__getitem__()メソッドを実装することを意味します。つまり、「コンテナ」であるオブジェクトを表します。つまり、他のオブジェクトが含まれています。これには、文字列、リスト、タプル、および辞書が含まれます。


2
どのように信頼できるでしょうか:hasattr(SomeClassWithoutGetItem, '__getitem__')添え字が付けられるかどうかを決定するには?
jmunsch

2
[... ]インデックスの構文が呼び出される添字それが実際の添字を使用して数学的表記法と同等だから、。たとえばa[1]、数学者がa₁と書くもののPythonです。したがって、「下付き可能」は「下付き可能」を意味します。これは、Pythonの用語で、それを実装する必要がありますを意味__getitem__()するので、a[1]のためだけ糖衣構文ですa.__getitem__(1)
マークリード

そのへの呼び出しhasattrは問題なく機能するはずですが、Pythonによる方法ではありません。Pythonの実践では、ダックタイピングを推奨しています。つまり、添え字を使用してオブジェクトからアイテムをフェッチしようとしている場合は、先に進んでください。オブジェクトが下付きではないため機能しないと思われる場合は、で tryブロックしてくださいexcept TypeError
マークリード

77

私の頭の上の、添え字を付けられる組み込みのものは次のとおりです。

string:  "foobar"[3] == "b"
tuple:   (1,2,3,4)[3] == 4
list:    [1,2,3,4][3] == 4
dict:    {"a":1, "b":2, "c":3}["c"] == 3

しかし、ミパディの答えは正しいです-実装するクラス__getitem__はすべて下付きです


17

スクリプト可能なオブジェクトは、オブジェクトに対して行われた操作を記録するオブジェクトであり、再生可能な「スクリプト」として保存できます。

例:アプリケーションスクリプトフレームワーク

さて、Alistairが彼が何を尋ねたかわからず、実際に(他の人が編集した)「下付き可能」オブジェクトを意味した場合、(mipadiも回答したように)これは正しいものです。

添え字付きオブジェクトは、__getitem__特別なメソッド(リスト、辞書など)を実装するオブジェクトです。


2
Alistairではなく、他の人が編集した「下付き可能」ではなく、「スクリプト可能」オブジェクトに関する元の質問に返信していることに注意してください。アリステアにコメントをお願いします。
tzot 2008年

ああ、私のコレクションの新しいバッジ!:)冗談です、明らかに。質問の編集を正当化した唯一のことは、Alistairが回答を選択したことです。Alistairが選択について確信していたかどうかはまだわかりません。
tzot 2008年

17

コンピューティングにおける添え字の意味は次のとおりです。「配列の要素の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'オブジェクトは下付きではありません


7

私も同じ問題を抱えていました。やっていた

arr = []
arr.append["HI"]

そのため、使用する[とエラーが発生しました。そのはずarr.append("HI")


3

ここでの以前の回答の当然の結果として、これは多くの場合、持っていないときにリスト(または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)あまりにも、トラップにそれを。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.