2017-04-24 94 views
0

我发现自己经常在Python中用tqdm来修改iterables的进度条,并想知道是否有这个快捷方式。有时候,我的迭代对象是很复杂的对象,所以找到放置括号的地方是很繁琐的。是否有可用于Python 3.6 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中引入这种类型的功能有多困难?

+2

不,没有。但是,为什么不只是'it = ',那么只是'for x in tqdm(it)': –

+0

这就是我一直在做的事情,但是如果可以完成装饰器选项,我会扩展这个想法去更多的事情。感谢您的建议! –

回答

0

装饰for循环可以被认为是与装饰可迭代的函数.__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 

这可能有点笨重,但希望你能弄清楚它的一些好用途。