2017-04-24 18 views
0

나는 파이썬에서 자주 반복문을 수정하여 progressbars에 대해 tqdm으로 찾았으며 이에 대한 바로 가기가 있는지 궁금해하고있었습니다. 때로는 반복 가능한 객체가 너무 길기 때문에 괄호를 어디에 두어야하는지 지루합니다.파이썬 3.6에서 for-loops에 사용할 수있는 데코레이터 스타일 구문이 있습니까?

for-loops에서 이러한 유형의 메서드를 사용하는 데코레이터 스타일 구문이 있습니까? 예를 들어

:

# 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 = <복잡한 반복 객체>'가 아니라'tqdm (it)'에 x가 사용 된 것인가 : –

+0

그게 내가하고있는 일이다. 그러나 장식 자 옵션을 할 수 있다면 아이디어를 확장 할 것이다. 더 많은 것들. 제안 tho 주셔서 감사합니다! –

답변

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 

이것은 다소 부피가 클 수 있지만 잘하면 사용법을 잘 이해할 수 있습니다.