如何枚举类方法然后用itertools.product()在python中?

2024-10-03 09:09:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我昨天刚从这个网站了解到我可以:

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类中这些序列方法链的可能组合,可能是:

^{pr2}$
  1. 如何使用itertools.product()

    (一)。生成可调用函数链列表?就像这样:

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

    (二)。生成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()可调用字符串中,也就是说生成更具体的可调用列表和eval()可调用字符串?在

谢谢!在


Tags: orself列表returndefcountevalhead
1条回答
网友
1楼 · 发布于 2024-10-03 09:09:45

注意,类似“s.head()”的东西意味着一个“绑定”到Seq的特定实例的方法,即“s”类似于序列头()”表示一个未绑定的方法,因此仍然可以在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))

不过,我不确定您所说的附加参数示例是什么意思。如何将不同的参数值与不同的函数组合起来?在

相关问题 更多 >