微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python,检查是否在“with”语句中调用

如何解决Python,检查是否在“with”语句中调用

我正在实现我的自定义 open() 函数(我们称之为 myopen())。任务是,我也希望能够将此函数with 语句 (with myOpen(...) as myFile:) 一起使用。据我所知,open() 必须返回文件对象(TextIOBinaryIO)。但是 open() 语句上下文中的 with 不是函数,而是实现 __enter____exit__ 的类。你有什么想法,如何将这两件事结合在一起? 谢谢!

解决方法

使用 with 语句仍然返回一个 _io.x 类。

>>> type(open('_file_'))
<class '_io.TextIOWrapper'>
>>> with open('_file_') as o: print(type(o))
... 
<class '_io.TextIOWrapper'>

with 语句只是为代码块分配另一个变量。 示例:

def five():
    return 5

print(five()) # -> 5
print(type(five())) # -> int

with five() as x:
    print(x) # -> 5
    print(type(x)) # -> int

print(x) # -> 5

with 语句等价于

x = five()
print(x)
print(type(x))

或者,对于 FileIO

handle = open('_file_')
# do things with handle
,

好吧,我找到了问题所在。一开始我想,那个 $today = (Get-Date).ToString('yyyyMMdd') $filesd = Get-ChildItem -Path "\\SERVER\file1.txt","\\SERVER\file2.txt","\\SERVER\file3.txt"| Select-Object -ExpandProperty CreationTime foreach($cd in $filesd) { if($cd.ToString('yyyyMMdd') -eq $today) { echo "OK" } else { echo "KO" } } 语句只能在类上调用,它有那些魔法方法(with__enter__)。所以:

__exit__

但它的工作方式不同。 with class_that_has_those_methods as return_value_from_enter: pass 之后的表达式也可以是函数,但它必须返回实现这些魔术方法的类的实例。我认为,这也是 python 的 with 工作方式。它是函数,它返回文件对象(更准确地说是包装器):

open

那个文件对象实现了那些魔法方法:

>>> type(open)
<class 'builtin_function_or_method'>
>>> type(open('file','w'))
<class '_io.TextIOWrapper'>

所以要解决我原来的问题,>>> a = open('file','w') >>> dir(a) [... '__dir__','__doc__','__enter__','__eq__','__exit__','__format__',...] 必须是函数,它返回文件对象,具有 myOpen()__enter__ 方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。