我发现自己经常使用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中引入这种类型的功能有多难?
答案 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
这可能有点笨重,但希望你能找到一些好的用途。