как перечислить метод класса, а затем связать их с помощью itertools.product () в python? - PullRequest
0 голосов
/ 05 июня 2011

Я только вчера узнал с этого сайта, что могу:

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(), tail() могут принимать параметры, и even(), odd() не требуется, например, Пареметр head () и tail () может из списков:

      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 (), a.k.a сгенерировать более конкретный список с возможностью вызова и строку с возможностью eval ()?

Спасибо!

1 Ответ

0 голосов
/ 05 июня 2011

Обратите внимание, что что-то вроде "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))

Я не уверен, что вы подразумеваете под примерами для дополнительных параметров.Как вы собираетесь комбинировать разные значения параметров с разными комбинациями функций?

...