2

我发现自己在 Python 中经常使用tqdmfor progressbars 修改可迭代对象,并且想知道是否有这样的捷径。有时我的可迭代对象是很长很复杂的对象,所以找到括号应该放在哪里很乏味。

是否有装饰器风格的语法可以在 for 循环中使用这些类型的方法?

例如:

# Regular for-loop
data = list("abc")

for element in data:
    print(element)
# a
# b
# c

# Progressbar
for element in tqdm(data):
    print(element)
# 100%|██████████| 3/3 [00:00<00:00, 5300.30it/s]
# a
# b
# c

中的语法是否可能类似于以下Python 3.6

@tqdm_decorator_style_object
for element in data:
    print(element)
# 100%|██████████| 3/3 [00:00<00:00, 5300.30it/s]
# a
# b
# c

我知道装饰器要修改一个函数,但我想知道是否有任何类似的东西可以用于非函数事件。如果没有,在 Python 中引入这种类型的功能会有多困难?

4

1 回答 1

1

装饰一个 for 循环可以被认为与装饰一个可迭代的.__next__()函数相同。

因为.__next__()大多数(如果不是全部)预定义对象的功能是只读的,所以您必须非常狡猾。

解决这个问题的一个简单方法是装饰.__next__()自定义类的函数。

def timesTwo(f):
    def wrapper(*args,**kwargs):
        return f(*args,**kwargs)*2
    return wrapper

class wrapIter():
    def __init__(self,f):
        self.f = f

    @timesTwo
    def __next__(self):
        return self.f.__next__()

    def __iter__(self):
        self.f = self.f.__iter__()
        return self

data = [1,2,3,4]
for x in wrapIter(data):
    print(x)

Output: 2 4 6 8

这可能有点笨重,但希望你能找到一些好的用途。

于 2017-04-24T23:53:18.693 回答