Python 中使用 with 语句时,覆盖函数不会被调用。

2024-10-04 01:27:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行作业中的代码,作业中有open。问题是,学生们被告知不要提交他们得到的数据,并假设我们有数据,而且open没有查看sys.path。你知道吗

幸运的是,我正在使用Spyder,它允许我在初始化控制台时选择要执行的脚本。我想我可以重写open,所以我定义了一个新的open函数,它在文件的绝对路径上调用原始的open。但是当有人使用with open(...) as ...时,它就不起作用了。你知道吗

我知道这可能不是一件好事,但我不能检查每个提交的作业中的每个文件,寻找并替换对open的调用。。。你知道吗

我的代码是:

old_open = open

def open(*args, **kwrdargs):
    try:
        res = old_open(*args,**kwrdargs)
        return res
    except:
        args= list(args)
        if ('DS1' in args[0]):
            args[0]=DS1
        elif ('DS2_X' in args[0]):
            args[0] = DS2_X
        elif ('DS2_Y' in args[0]):
            args[0] = DS2_Y
        args = tuple(args)
        res = old_open(*args,**kwrdargs)
        return res

DS1DS2_XDS2_Y包含文件的绝对路径。你知道吗

执行时:

with open('DS1.data', 'r') as f:

我得到一个错误:

FileNotFoundError: [Errno 2] No such file or directory: 'DS1.data'

使用时:

f=open('DS1.data','r')

工作。你知道吗

我调试了代码,当使用with时,不会调用我的open,但当使用f=open(...)时,会调用。为什么会这样?你知道吗


Tags: 文件数据代码indataaswith作业
1条回答
网友
1楼 · 发布于 2024-10-04 01:27:23

open应该返回一个类似文件的对象,这个对象(即下例中的f)应该有一个__enter____exit__。例如,您可以将with-语句编写为:

f = open(...)

with f as ...:
    do_something()

如果不返回由open返回的对象,而是返回文件对象周围的某个自己的包装器,那么您也必须包装这些对象。但从你的描述来看,它更像是你不需要它,而是你在某处没有返回一个文件。你的open应该看起来像:

def open(fname, *args, **kwds):
    for p in sys.path:
        fn = build_filename(p, fname)

        try:
            return _orig_open(fn, *args, **kwds)
        except IOerror as e:
            pass

    return _orig_open(fn, *args, **kwds) # must return file or rais exception

相关问题 更多 >