リスト (たとえば、本) の各項目に対して API を呼び出して、本に関するメタデータを取得する作業プログラムがあります。book : メタデータを dict に保存して使用します。これにより、メタデータの収集中にユーザーが待機するため、過剰な呼び出しを避けるために、必要な場合にのみ応答を取得できるように、前述の API 呼び出しを行う前に dict を CSV に永続化し、それをロードしています。
ただし、永続化された dict を読み取るコンテキスト マネージャーを導入し、関数 ("gatherfiles()") に call-if-not-there ロジックを実行すると、3 番目の関数にアクセスできなくなります。
メイン関数を呼び出すと、gatherfiles() によって dict が返されることがわかりますが、3 番目の関数呼び出し (「pickabook()」) を行うと、keyerror が発生し、空の辞書が表示されます。
以下のコードの編集版を入れました。私の推測では、何らかの形でコンテキスト マネージャーがスコープを変更した (つまり、1 つの shimdict をグローバルとして、もう 1 つをローカルとして扱う) ことですが、私がオンラインで読むことができるものを考えると、それは正しくないようです。それで、醜くない考えはありますか?
shimdict = {}
def pickabook(book=None):
print(shimdict, "<-this is {}. why?!?")
picked = shimdict.pop(book)
def gatherfiles(directory):
with open('test.csv', 'rb') as f:
reader = csv.reader(f,)
shimdict = dict((rows[0],rows[1]) for rows in reader)
with open('test.csv', 'a+b') as f:
w = csv.writer(f)
ff = os.listdir(directory)
for f in ff:
if f.rsplit('.', 1)[1].lower() in [....]:
filename = os.path.join(directory, f)
if filename in shimdict.keys():
print("already here")
else:
print("make the api call, then write the value to dict & then csv")
shimdict[filename] = (returnedvalue)
w.writerow([filename, (returnedvalue)])
return shimdict
def main():
shimdict = gatherfiles(directory)
print(shimdict, "<-dictionary works")
while 1:
print(shimdict, "<-dictionary works")
current = pickabook(bookname)
---- 以下を編集 ---- 私は自分の質問を明確に十分に提起したとは思いません。コンテキストマネージャーが削除されている場合、「pickabook()」の辞書「shimdict」にアクセスできます。つまり、次のコードを使用します。
def gatherfiles(directory):
ff = os.listdir(directory)
for f in ff:
if f.rsplit('.', 1)[1].lower() in [....]:
filename = os.path.join(directory, f)
shimdict[filename] = (returnedvalue)
return shimdict
したがって、グローバルを使用するか、ローカル辞書を関数に渡してこれを修正できることを完全に理解していますが、コンテキストマネージャーを追加すると動作が変わる理由を知りたいです。