[英]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内置open
函数重新分配给代码中的其他内容(几乎没有其他合理的方式可以解释此异常)。
然后with
语句将尝试将其用作上下文管理器,并在首次进入with
块时尝试调用其__enter__
方法。 这会导致您看到错误消息,因为您的对象open
,无论它是什么,都没有__enter__
方法。
在 Python 模块中查找要重新分配open
。 最明显的是:
def open(..)
open =
直接重新分配from foo import open
或import 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:
就我而言,我是故意用定义函数调用秒表定制
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 问题。
检查您的python版本,OP的语法仅在3.8+中支持
我默认的 Python 3.6 Ubuntu 安装需要不同的分析语法,如下所述(当从下拉列表中选择 3.6 版时): https : //docs.python.org/3.6/library/profile.html#module-cProfile
效果很好:
import cProfile, pstats, io
pr = cProfile.Profile()
pr.enable()
# ... do something ...
pr.disable()
s = io.StringIO()
sortby = 'cumulative'
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print(s.getvalue())
# optional for better viz
ps.dump_stats(filename='needs_profiling.prof')
建议:用snakeviz交互式地可视化这个。
sudo pip3 install snakeviz
snakeviz ./needs_profiling.prof
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.