繁体   English   中英

Python 错误:“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内置open函数重新分配给代码中的其他内容(几乎没有其他合理的方式可以解释此异常)。

然后with语句将尝试将其用作上下文管理器,并在首次进入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:

就我而言,我是故意定义函数调用秒表定制

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM