明星拆包自己的课程

Seb*_*zny 6 python class python-3.x iterable-unpacking

我想知道是否可以使用自己的类进行星形解包,而不仅仅是使用listtuple.

class Agent(object):
    def __init__(self, cards):
        self.cards = cards
    def __len__(self):
        return len(self.cards)
    def __iter__(self):
        return self.cards
Run Code Online (Sandbox Code Playgroud)

并且能够写作

agent = Agent([1,2,3,4])
myfunc(*agent)
Run Code Online (Sandbox Code Playgroud)

但我得到:

TypeError: visualize() argument after * must be a sequence, not Agent
Run Code Online (Sandbox Code Playgroud)

为了使拆包成为可能,我必须实施哪些方法?

And*_*den 9

异常消息:

*之后的参数必须是一个序列

应该说,argument after * must be an iterable.

由于这个原因,星形拆包通常称为"可迭代拆包".请参阅PEP 448(附加拆包概括)PEP 3132(扩展可迭代解包).

编辑:看起来这已经修复了python 3.5.2和3.6.将来会说:

*之后的参数必须是可迭代的


为了让星形解包,你的类必须是可迭代的,即它必须定义一个__iter__返回迭代器:

class Agent(object):
    def __init__(self, cards):
        self.cards = cards
    def __len__(self):
        return len(self.cards)
    def __iter__(self):
        return (card for card in self.cards)
Run Code Online (Sandbox Code Playgroud)

然后:

In [11]: a = Agent([1, 2, 3, 4])

In [12]: print(*a)  # Note: in python 2 this will print the tuple
1 2 3 4
Run Code Online (Sandbox Code Playgroud)