Python Error: “AttributeError: __enter__”
所以,我无法加载我的json文件,我不知道为什么,任何人都可以解释我做错了什么?
1 2 3 4
| async def give(msg, arg):
if arg[0] == prefix +"dailycase":
with open("commands/databases/cases.json","r") as d:
data = json.load(d) |
出于某种原因,我收到此错误:
1 2
| with open("commands/databases/cases.json","r") as d:
AttributeError: __enter__ |
-
您是否已将内置open定义为代码中的其他内容? 通过赋值(open =)或从某处(from place import open)导入它?
-
它不是一个重复,但相关:stackoverflow.com/questions/1984325/…
-
测试@LukasGraf的理论:print(open.__doc__) ...如果你没有看到大量的内部python文本,从"打开文件并返回流"开始,那么他的理论是正确的。
-
@JacobIRR:您可以通过执行import io并测试open is io.open(在Python 3上,内置open别名io.open)来确认它是否为内置open。
-
@RyanHaining:不一定; 在相关项目完全构建之前,不会查找__enter__; odds是open调用成功,它只是引用了错误的open,但一旦成功,那个错误的open就不再出现在调用堆栈上了。
-
@ShadowRanger你是对的。 没有意识到,删除了评论
最有可能的是,你已经将Python内置的open函数重新分配给代码中的其他东西(几乎没有其他合理的方法可以解释这个异常)。
然后with语句将尝试将其用作上下文管理器,并在首次进入with块时尝试调用其__enter__方法。这会导致您看到的错误消息,因为您的对象名为open,无论它是什么,都没有__enter__方法。
在Python模块中查找要重新分配open的位置。最明显的是:
-
全局范围内的函数,如def open(..)
-
使用open =直接重新分配
-
进口如from foo import open或import something as open
该函数最可能是可疑的,因为它似乎是open实际上是可调用的。
为了帮助您找到意外绑定的对象open,您还可以尝试
1
| print('open is assigned to %r' % open) |
紧接在with语句之前。如果它没有说,你就找到了罪魁祸首。
-
我仔细检查了我的所有文件的脚本,看看我做错了什么,不,我没有ant变量或导入名为"open",但我做错了,我看到我创建了一个名为"open"的函数,我没有 实现。 感谢您的支持和抱歉!
-
你很受欢迎,很高兴我可以提供帮助 - 遮蔽一个内置的名字是一个让我们大多数人同时绊倒的问题;-)