Pythonでは、一般的なスライス構文を正確にカプセル化して渡すことは可能ですか?slice
スライスを使用または__slice__
エミュレートできることを知っています。ただし、で使用される角かっこに入れるのとまったく同じ構文を渡したいと思います__getitem__
。
たとえば、リストの一部を返す関数を作成したとします。
def get_important_values(some_list, some_condition, slice):
elems = filter(some_condition, some_list)
return elems[slice]
スライスオブジェクトを手動で渡すと、これは正常に機能します。
In [233]: get_important_values([1,2,3,4], lambda x: (x%2) == 0, slice(0, None))
Out[233]: [2, 4]
しかし、私がユーザーに渡させたいのは、ユーザーが使用したのとまったく同じスライス__getitem__
です。
get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:-1) )
# or
get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:) )
明らかに、これは構文エラーを生成します。しかし、タイプスライス用に独自のミニパーサーを作成せずにx:y:t
、ユーザーに文字列として渡すように強制することなく、これを機能させる方法はありますか?
動機
filter(some_condition, some_list)
このサンプル関数に、結果全体がリストになるなど、直接スライス可能なものを返すようにすることもできます。ただし、実際の例では、内部関数ははるかに複雑であり、ユーザーが必要とするスライスを事前に知っていれば、計算を大幅に簡略化できます。しかし、事前にスライスを教えてもらうために、ユーザーが余分なことをする必要がないようにしたいと思います。