我有一个工作程序,它为列表的每个项目(比如一本书)调用一个 API,以获取有关该书的元数据。它将 book : metadata 存储在 dict 中以供使用。这会导致用户在元数据收集期间等待,因此避免过多调用我将字典保存到 CSV 并在进行上述 API 调用之前加载它,以确保我只在必要时得到响应。
但是,当我引入上下文管理器来读取持久化的字典,然后在函数(“gatherfiles()”)中执行调用逻辑时,第三个函数不再可以访问它。
当我在主函数中调用时,我可以看到收集文件()返回了字典,但是当我进行第三次函数调用(对“pickabook()”)时,我得到一个键错误,我看到一个空字典。
我在下面放了一个经过编辑的代码版本。我的猜测是,上下文管理器以某种方式改变了范围(因此它将一个 shimdict 视为全局,一个视为本地),但鉴于我可以在线阅读的内容,这似乎并不正确。那么这里有什么不丑的想法吗?
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
所以我完全明白我可以使用全局或将本地字典传递给函数来解决这个问题,但我想知道为什么添加上下文管理器会改变行为。