operator モジュールは、Python 固有の各演算子に対応している C 言語で実装された関数セットを提供します。例えば、 operator.add(x, y) は式 x+y と等価です。関数名は特殊なクラスメソッドとして扱われます; 便宜上、先頭と末尾の __ を取り除いたものも提供されています。
これらの関数はそれぞれ、オブジェクトの比較、論理演算、数学演算、シーケンス操作、および抽象型テストに分類されます。
オブジェクト比較関数は全てのオブジェクトで有効で、関数の名前はサポートする大小比較演算子からとられています:
これらは a および b の大小比較を行います。特に、 lt(a, b) は a < b 、 le(a, b) は a <= b 、 eq(a, b) は a == b 、 ne(a, b) は a != b 、 gt(a, b) は a > b 、そして ge(a, b) は a >= b と等価です。組み込み関数 cmp() と違って、これらの関数はどのような値を返してもよく、ブール代数値として解釈できてもできなくてもかまいません。大小比較の詳細については 比較 (comparison) を参照してください。
バージョン 2.2 で追加.
論理演算もまた全てのオブジェクトに対して適用することができ、真値テスト、同一性テストおよびブール演算をサポートします:
not obj の結果を返します。(オブジェクトのインスタンスには __not__() メソッドは適用されないので注意してください; この操作を定義しているのはインタプリタコアだけです。結果は __nonzero__() および __len__() メソッドによって影響されます。)
a is b を返します。オブジェクトの同一性をテストします。
a is not b を返します。オブジェクトの同一性をテストします。
演算子で最も多いのは数学演算およびビット単位の演算です:
__future__.division が有効でない場合には a / b を返します。 “古い(classic)” 除算としても知られています。
obj のビット単位反転を返します。 ~obj と同じです。
バージョン 2.0 で追加: 名前 invert() および __invert__() が追加されました。
__future__.division が有効な場合 a / b を返します。 “真の”除算としても知られています。
バージョン 2.2 で追加.
シーケンスを扱う演算子(いくつかの演算子は map 型も扱います)には以下のようなものがあります:
b in a を調べた結果を返します。演算対象が左右反転しているので注意してください。
バージョン 2.0 で追加: 関数名 __contains__() が追加されました。
a の中に b が出現する回数を返します。
a でインデクスが b から c-1 のスライス要素を削除します。
バージョン 2.6 で撤廃: この関数は Python 3.0 で削除されます。 delitem() をスライスインデクスで使って下さい。
a でインデクスが b から c-1 のスライス要素を返します。
バージョン 2.6 で撤廃: この関数は Python 3.0 で削除されます。 getitem() をスライスインデクスで使って下さい。
a で最初に b が出現する場所のインデクスを返します。
バージョン 2.6 で撤廃: この関数は Python 3.0 で削除されます。 代わりに __mul__() を使って下さい。
シーケンス a と整数 b について a * b を返します。
バージョン 2.0 で撤廃: contains() を使ってください。
contains() の別名です。
a でインデクスが b から c-1 のスライス要素の値をシーケンス v に設定します。
バージョン 2.6 で撤廃: この関数は Python 3.0 で削除されます。 setitem() をスライスインデクスで使って下さい。
operator の関数を使う例を挙げます:
>>> # Elementwise multiplication
>>> map(mul, [0, 1, 2, 3], [10, 20, 30, 40])
[0, 20, 60, 120]
>>> # Dot product
>>> sum(map(mul, [0, 1, 2, 3], [10, 20, 30, 40]))
200
多くの演算に「その場」バージョンがあります。以下の関数はそうした演算子の通常の文法に比べてより素朴な呼び出し方を提供します。たとえば、文(statement) x += y は x = operator.iadd(x, y) と等価です。別の言い方をすると、 z = operator.iadd(x, y) は複合文 z = x; z += y と等価です。
a = iconcat(a, b) は二つのシーケンス a と b に対し a += b と等価です。
バージョン 2.5 で追加.
a = idiv(a, b) は __future__.division が有効でないときに a /= b と等価です。
バージョン 2.5 で追加.
a = ifloordiv(a, b) は a //= b と等価です。
バージョン 2.5 で追加.
a = ilshift(a, b) は a < <= b と等価です。
バージョン 2.5 で追加.
バージョン 2.6 で撤廃: この関数は Python 3.0 で削除されます。 代わりに __imul__() を使って下さい。
a = irepeat(a, b) は a がシーケンスで b が整数であるとき a *= b と等価です。
バージョン 2.5 で追加.
a = irshift(a, b) は a >>= b と等価です。
バージョン 2.5 で追加.
a = itruediv(a, b) は __future__.division が有効なときに a /= b と等価です。
バージョン 2.5 で追加.
operator モジュールでは、オブジェクトの型を調べるための述語演算子も定義しています。しかしながらこれらはいつでも信頼できるというわけではありません。代わりに抽象基底クラスをテストするのが望ましい方法です (詳しくは collections や numbers を参照して下さい)。
バージョン 2.0 で撤廃: isinstance(x, collections.Callable)() を使ってください。
オブジェクト obj を関数のように呼び出すことができる場合真を返し、それ以外の場合偽を返します。関数、バインドおよび非バインドメソッド、クラスオブジェクト、および __call__() メソッドをサポートするインスタンスオブジェクトは真を返します。
バージョン 2.6 で撤廃: この関数は Python 3.0 で削除されます。 代わりに isinstance(x, collections.Mapping) を使って下さい。
オブジェクト obj がマップ型インタフェースをサポートする場合に真を返します。辞書および __getitem__() メソッドが定義された全てのインスタンスオブジェクトに対しては、この値は真になります。
バージョン 2.6 で撤廃: この関数は Python 3.0 で削除されます。 代わりに isinstance(x, numbers.Number) を使って下さい。
オブジェクト obj が数値を表現している場合に真を返します。 C で実装された全ての数値型対して、この値は真になります。
バージョン 2.6 で撤廃: この関数は Python 3.0 で削除されます。 代わりに isinstance(x, collections.Sequence) を使って下さい。
obj がシーケンス型プロトコルをサポートする場合に真を返します。シーケンス型メソッドを C で定義している全てのオブジェクトおよび __getitem__() メソッドが定義された全てのインスタンスオブジェクトに対して、この値は真になります。
operator モジュールはアトリビュートとアイテムの汎用的な検索のための道具も定義しています。 map(), sorted(), itertools.groupby(), や関数を引数に取るその他の関数に対して高速にフィールドを抽出する際に引数として使うと便利です。
演算対象から attr を取得する呼び出し可能なオブジェクトを返します。二つ以上のアトリビュートを要求された場合には、アトリビュートのタプルを返します。 f = attrgetter('name') とした後で、 f(b) を呼び出すと b.name を返します。 f = attrgetter('name', 'date') とした後で、 f(b) を呼び出すと (b.name, b.date) を返します。
アトリビュート名にドットを含んでも構いません。 f = attrgetter('date.month') とした後で、 f(b) を呼び出すと b.date.month を返します。
バージョン 2.4 で追加.
バージョン 2.5 で変更: 複数のアトリビュートがサポートされました。
バージョン 2.6 で変更: ドット付きアトリビュートがサポートされました。
演算対象からその __getitem__() メソッドを使って item を取得する呼び出し可能なオブジェクトを返します。二つ以上のアイテムを要求された場合には、アイテムのタプルを返します。以下のコードと等価です:
def itemgetter(*items):
if len(items) == 1:
item = items[0]
def g(obj):
return obj[item]
else:
def g(obj):
return tuple(obj[item] for item in items)
return g
アイテムは演算対象の __getitem__() メソッドが受け付けるどんな型でも構いません。辞書ならば任意のハッシュ可能な値を受け付けますし、リスト、タプル、文字列などはインデクスかスライスを受け付けます:
>>> itemgetter(1)('ABCDEFG')
'B'
>>> itemgetter(1,3,5)('ABCDEFG')
('B', 'D', 'F')
>>> itemgetter(slice(2,None))('ABCDEFG')
'CDEFG'
バージョン 2.4 で追加.
バージョン 2.5 で変更: 複数のアトリビュートがサポートされました.
itemgetter() を使って特定のフィールドをタプルから取り出す例:
>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
>>> getcount = itemgetter(1)
>>> map(getcount, inventory)
[3, 2, 5, 1]
>>> sorted(inventory, key=getcount)
[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
引数の name メソッドを呼び出す呼び出し可能オブジェクトを返します。追加の引数および/またはキーワード引数が与えられると、これらもそのメソッドに引き渡されます。 f = methodcaller('name') とした後で、 f(b) を呼び出すと b.name() を返します。 f = methodcaller('name', 'foo', bar=1) とした後で、 f(b) を呼び出すと b.name('foo', bar=1) を返します。
下のテーブルでは、個々の抽象的な操作が、どのように Python 構文上の各演算子や operator モジュールの関数に対応しているかを示しています。
操作 | 構文 | 関数 |
---|---|---|
加算 | a + b | add(a, b) |
結合 | seq1 + seq2 | concat(seq1, seq2) |
包含テスト | obj in seq | contains(seq, obj) |
除算 | a / b | div(a, b) (__future__.division が無効な場合) |
除算 | a / b | truediv(a, b) (__future__.division が有効な場合) |
除算 | a // b | floordiv(a, b) |
論理積 | a & b | and_(a, b) |
排他的論理和 | a ^ b | xor(a, b) |
ビット反転 | ~ a | invert(a) |
論理和 | a | b | or_(a, b) |
べき乗 | a ** b | pow(a, b) |
インデクス指定の代入 | obj[k] = v | setitem(obj, k, v) |
インデクス指定の削除 | del obj[k] | delitem(obj, k) |
インデクス指定 | obj[k] | getitem(obj, k) |
左シフト | a << b | lshift(a, b) |
剰余 | a % b | mod(a, b) |
乗算 | a * b | mul(a, b) |
(算術)否 | - a | neg(a) |
(論理)否 | not a | not_(a) |
符号反転 | + a | pos(a) |
右シフト | a >> b | rshift(a, b) |
シーケンスの反復 | seq * i | repeat(seq, i) |
スライス指定の代入 | seq[i:j] = values | setslice(seq, i, j, values) |
スライス指定の削除 | del seq[i:j] | delslice(seq, i, j) |
スライス指定 | seq[i:j] | getslice(seq, i, j) |
文字列書式化 | s % obj | mod(s, obj) |
減算 | a - b | sub(a, b) |
真値テスト | obj | truth(obj) |
順序付け | a < b | lt(a, b) |
順序付け | a <= b | le(a, b) |
等価性 | a == b | eq(a, b) |
不等性 | a != b | ne(a, b) |
順序付け | a >= b | ge(a, b) |
順序付け | a > b | gt(a, b) |