デコレータがどのように機能するのかに興味があったので、ウォーキング パス内に汎用関数を配置するのに機能するかどうかを調べていました。パスの下のスペースで区切られたファイルで整数の最長セグメントを返したいと思いました(そして、この値を返すか、おそらくそれを印刷します)。これは可能ですか?
countL で物事を返そうとしましたが、成功しませんでした。次に、これがどのように機能するかを関数の外に配置した場合に興味がありました。デコレータは印刷専用ですか、それともデコレータから戻ってこの例を適切に動作させることができますか??
def walkPath(fn):
def wrapper(*args, **kwargs):
outside = None
for dirname, dirnames, filenames in os.walk(args[0]):
for filename in filenames:
fn(filename, dirname, outside, *args, **kwargs)
return wrapper
@walkPath
def countL(filename, dirname, outside, path, extension = '.wrd'):
if (filename[-4:] == extension):
with open(os.path.join(dirname, filename), 'r') as input:
data = input.readlines()
for i in range(len(data)):
temp = data[i].split()
if (int(temp[1]) - int(temp[0]) > longest):
outside = int(temp[1]) - int(temp[0])
これは、私がデコレータなしで何をしていたかを説明しており、同じ機能を得ることができるかどうかを確認していましたが、それを汎用にしています。これは、一連のファイルの中で必ずしも最長の単語ではなく、たとえばファイル名に「s」という単語が含まれる一連のファイルである可能性があることを意味します。外部変数を最長で適切に処理する方法、またはそれがデコレータで可能かどうかがわからないだけです。
def countLength(path, extension = '.wrd'):
longest = 0
for dirname, dirnames, filenames in os.walk(path):
for filename in filenames:
if (filename[-4:] == extension):
with open(os.path.join(dirname, filename), 'r') as input:
data = input.readlines()
for i in range(len(data)):
temp = data[i].split()
if (int(temp[1]) - int(temp[0]) > longest):
longest = int(temp[1]) - int(temp[0])
return longest