如何枚举类方法然后将它们与 python 中的 itertools.product() 链接起来?

发布于 2024-11-12 15:05:12 字数 1560 浏览 3 评论 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()tail()可以接受参数,even()odd() > 不需要,例如, head() 和 tail() 的参数可以来自列表:

    <前><代码> head_lmt = [10,20,30] tail_lmt = [30,40,50] foo = s.head().odd().tail().reverse() ^------------------------------------head_lmt 10 或 20 或 30 ^-----------------------tail_lmt 30 或 40 或 50

如果我的 Q1 是可能的,我如何将这些参数填充到可调用列表和 eval() 可字符串中,也就是生成更具体的可调用列表和可 eval() 的字符串?

谢谢!

I just learned yesterday from this site that I can:

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]

I want to enumerate possible combination of those sequence method chains inside of class Seq, may sort of:

itertools.product([s.head,s.odd,s.even,s.reverse], repeat=4)    
# may not just limited those 4 functions
  1. how to use the itertools.product() to

    1). generate invoke-able function chains list? just like this:

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

    2). generate eval()able chain strings then I can store in ascii file or eval() later or for logging purpose?

  2. the head(), tail() may accept parameter, and even(), odd() is not need to, for example,
    the paremeter of head() and tail() may from lists:

      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
    

If my Q1 is possible, how I can fill those parameter into the invoke-able list and the eval()-able string, a.k.a generate more specific invoke-able list and the eval()-able string?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深居我梦 2024-11-19 15:05:12

请注意,类似“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))

不过,我不确定附加参数的示例是什么意思。您打算如何将不同的参数值与不同的功能组合结合起来?

Note that something like "s.head()" means a method which is "bound" to that specific instance of Seq, that is, "s." Something like "Seq.head()" means a method which is unbound, so one can still pass in different instances of Seq.

From there it simply requires basic functional composition and string concatenation.

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))

I'm not sure what you mean by the examples for the additional parameters, though. How do you intend to combine the different parameter values with the different combinations of functions?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文