:__getitem__をきれいに書くには?シーケンスの種類を実装するとき、私はしばしば自分自身がこのようなコードを書く見つける(相対的に言って)のPythonでは、
class FooSequence(collections.abc.Sequence):
# Snip other methods
def __getitem__(self, key):
if isinstance(key, int):
# Get a single item
elif isinstance(key, slice):
# Get a whole slice
else:
raise TypeError('Index must be int, not {}'.format(type(key).__name__))
コードがisinstance()
で明示的に引数の型をチェックします。これはPythonコミュニティ内のregarded as an antipatternです。どうすればそれを避けることができますか?
- それは方法と互換性がないquite deliberatelyだので、私は(それは我々がすでにOOPの多型を経由して
self
に派遣しているので、完全に無用である、self
に派遣しようとします)、functools.singledispatch
を使用することはできません。@staticmethod
と動作しますが、self
のものを取り除く必要がある場合はどうすればよいですか? int()
にキャスティングしてTypeError
をキャッチし、スライスを確認し、おそらく再発生させることはまだ醜いですが、多少はそうではありません。- 整数を1要素のスライスに変換し、同じコードで両方の状況を処理するのはきれいですが、それ自体の問題があります(
0
または[0]
?を返す)。
言うまでもなく、*私たちは '__getslice__'でこれを行うために*使われていますが、これは廃止されました。これは技術全体の健全性に疑問を感じます。 – Kevin
@ケビン、それは異なる理由で廃止されました。彼らは 'slice'オブジェクトを作成したかったのですが、' __getslice__'は 'i'と' j'引数をとりました。下位互換性が壊れていました。 –