如何解决Python,检查是否在“with”语句中调用
我正在实现我的自定义 open()
函数(我们称之为 myopen()
)。任务是,我也希望能够将此函数与 with
语句 (with myOpen(...) as myFile:
) 一起使用。据我所知,open()
必须返回文件对象(TextIO
或 BinaryIO
)。但是 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 举报,一经查实,本站将立刻删除。