是否有可以在Python 3.6中的for循环中使用的装饰器样式语法?

时间:2017-04-24 21:10:29

标签: python syntax progress-bar decorator tqdm

我发现自己经常使用tqdm在Python中修改iterables for progressbars,并且想知道是否有这样的快捷方式。有时我的iterables实际上是很复杂的对象,所以找到括号的位置是很繁琐的。

是否有装饰风格的语法在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中引入这种类型的功能有多难?

1 个答案:

答案 0 :(得分:0)

装饰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

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