0

昨日、このサイトから次のことができることを知りました。

class Seq(object):
    def __init__(self, seq):
        self.seq = seq
    def __repr__(self):
        return repr(self.seq)
    def __str__(self):
        return str(self.seq)
    def all(self):
        return Seq(self.seq[:])
    def head(self, count):
        return Seq(self.seq[:count])
    def tail(self, count):
        return Seq(self.seq[-count:])
    def odd(self):
        return Seq(self.seq[1::2])
    def even(self):
        return Seq(self.seq[::2])
    def reverse(self):
        return Seq(self.seq[::-1])

>>> s = Seq(range(0, 100))
>>> print s.head(10).odd().even().reverse()
[9, 5, 1]

クラス Seq 内のこれらのシーケンス メソッド チェーンの可能な組み合わせを列挙したいと思います。

itertools.product([s.head,s.odd,s.even,s.reverse], repeat=4)    
# may not just limited those 4 functions
  1. itertools.product()の使い方

    1)。呼び出し可能な関数チェーン リストを生成しますか? ちょうどこのような:

    foo = s.head().odd().even().reverse()

    2)。eval() 可能なチェーン文字列を生成し、後で ascii ファイルまたは eval() に保存するか、ログの目的で保存できますか?

  2. はパラメーターを受け入れることができhead()、はその必要はありません。たとえば、head() と tail() のパラメーターはリストから取得できます。 tail()even()odd()

      head_lmt = [10,20,30]
      tail_lmt = [30,40,50]
      foo = s.head().odd().tail().reverse()
                   ^------------------------------------head_lmt  10 or 20 or 30
                                ^-----------------------tail_lmt  30 or 40 or 50
    

私のQ1が可能であれば、それらのパラメーターを呼び出し可能なリストとeval()可能な文字列に入力するにはどうすればよいですか?より具体的な呼び出し可能なリストとeval()可能な文字列を生成するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

0

「s.head()」のようなものは、Seq の特定のインスタンス、つまり「s」に「バインド」されたメソッドを意味することに注意してください。「Seq.head()」のようなものは、バインドされていないメソッドを意味するため、Seq のさまざまなインスタンスを渡すことができます。

そこからは、基本的な機能構成と文字列連結が必要になるだけです。

def chain_method(from_method, to_method):
    def inner(arg):
        return to_method(from_method(arg))
    return inner

possible_funcs = []
log_strings = []
for possible_combo in itertools.product([Seq.head,Seq.odd,Seq.even,Seq.reverse], repeat=4):
    meta_method = possible_combo[0]
    for method in possible_combo[1:]:
        meta_method = chain_method(meta_method, method)
    log_string = []
    for method in possible_combo:
        log_string.extend(['.', method.__name__, '()'])
    possible_funcs.append(meta_method)
    log_strings.append("".join(log_string))

ただし、追加のパラメーターの例が何を意味するのかわかりません。さまざまなパラメーター値をさまざまな機能の組み合わせとどのように組み合わせるつもりですか?

于 2011-06-05T06:25:30.630 に答える