2017-04-24 2 views
0

私は自分自身が進歩バーのためにtqdmとPythonで非常に頻繁にiterablesを変更していることを知っていて、これに対するショートカットがあるのだろうかと思っていました。時には私のイテラブルは本当に複雑なオブジェクトなので、カッコをどこに置くべきかを知るのは面倒です。Python 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 = <複雑なiterableオブジェクト>'だけではなく、 'xのtqdm(it)'のためだからです: –

+0

これは私がやってきたことですが、デコレータオプションができたら、より多くのものに。提案をありがとうtho! –

答えて

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 

これは少し大きめかもしれませんが、うまくいけばそれをいくつかうまく利用することができます。

関連する問題