Python Error: "AttributeError: __enter__"

Python Error: "AttributeError: __enter__"

所以,我无法加载我的 json 文件,我不知道为什么,谁能解释我做错了什么?

async def give(msg, arg):
    if arg[0] == prefix + "dailycase":
                with open("commands/databases/cases.json", "r") as d:
                     data = json.load(d)

出于某种原因,我收到此错误:

    with open("commands/databases/cases.json", "r") as d:
AttributeError: __enter__

很可能,您已将 Python builtin open function 重新分配给代码中的其他内容(几乎没有其他合理的方式可以解释此异常 ).

with 语句将尝试将其用作 context manager,并在首次进入 with 块时尝试调用其 __enter__ 方法。这会导致您看到错误消息,因为您的对象 open,无论它是什么,都没有 __enter__ 方法。


在您的 Python 模块中寻找重新分配 open 的位置。最明显的是:

  • 全局范围内的函数,如def open(..)
  • 使用 open =
  • 直接重新分配
  • 导入 from foo import openimport something as open

函数最有可能是可疑的,因为看起来你的open实际上是一个可调用函数。

为了帮助您找到 open 意外绑定到的对象,您也可以尝试

print('open is assigned to %r' % open)

紧接在您的 with 声明之前。如果它没有显示 <built-in function open>,您就找到了罪魁祸首。

我在这一行遇到了这个错误:

with concurrent.futures.ProcessPoolExecutor as executor:

缺少括号 是问题所在

with concurrent.futures.ProcessPoolExecutor() as executor:

就我而言,我有意定义了一个名为 stopwatch

的自定义 with 函数
with stopwatch('upload %d bytes' % len(data)):
    ...code...

因此必须添加:

import contextlib

并为自定义函数定义加上前缀:

@contextlib.contextmanager
def stopwatch(message):
    ...code...

我的问题是我希望 os.open 像内置 open...

一样工作

这导致 AttributeError: __enter__

import os 
with os.open('out.txt', os.CREAT) as f:
  f.write('hello world')

这不

with open('out.txt', 'w') as f:
  f.write('hello world')

我想 from os import open 很容易导致 OP 问题。