我正在尝试使用元组解包来实现自定义可迭代。可迭代的大小应该随着 lhs 中变量的数量而增加

问题描述 投票:0回答:1

编写一个给出预期输出的Python类当前给出ValueError

#Can be modified. (Can even be a function or generator
class MyClass: 
    def init(self): 
        self.count = 0
    def __iter__(self):
        return self
    
    def __next__(self):
        self.count+=1
        return self.count

#Cannot be modified Cannot pass arguments to MyClass constuctor 
x, y = MyClass()
print(x, y)  # Should return 1, 2 
x, y, z= MyClass() 
print(1, 2, 3) # 1, 2, 3

最接近的解决方法是将参数传递给构造函数

class MyClass: 
    def init(self, n): 
        self.x = range(n)
    def __iter__(self):
        return iter(x)

#Cannot be modified I want to avoid passing n
 x, y = MyClass(2)
 x, y, z= MyClass(3) 

稍微更好的解决方法是使用非常大的默认 n 并在 lhs 末尾使用 *

class MyClass: 
    def init(self, n=100): 
        self.x = range(n)
    def __iter__(self):
        return iter(x)

x, y, *_ = MyClass()
x, y, z, *_ = MyClass() 
python-3.x iterable-unpacking
1个回答
0
投票

迭代器无法“查询”赋值来找出需要多少个值。它将产生固定数量的值,或不确定数量的值,并且会发生以下两种情况之一:

  1. 迭代器产生的值与 LHS 所需的值完全相同,并且赋值成功。 (这包括 LHS 有一个
    *
    元素,根据需要“吸收”尽可能多的值。)
  2. 迭代器产生太多或太少的值,导致
    ValueError
    。 (这包括使用无限迭代器,因为任何有限数量的目标最终都会耗尽。)
© www.soinside.com 2019 - 2024. All rights reserved.