gpt4 book ai didi

python - 用简单的函数替换类方法

转载 作者:行者123 更新时间:2023-11-28 22:50:31 27 4
gpt4 key购买 nike

作为这里的示例,我想创建一个函数来临时将标准输出定向到日志文件。

棘手的是代码必须保留文件处理程序和 std sav 以便在重定向后恢复,我将其写在类类型中以保留这两个变量。

完整代码如下:

class STDOUT2file:
def __init__(self,prefix='report@'):

now=dt.date.today()
repname=repnameprefix=prefix+now.strftime("%Y%m%d")+'.txt'
count=0
while os.path.isfile(repname):
count+=1
repname=repnameprefix+(".%02d" %(count))
self.sav=sys.stdout
f=open(repname,'w')
sys.stdout=f
self.fname=repname
self.fhr=f


def off(self,msg=False):

sys.stdout=self.sav
self.fhr.close()
if msg:
print('output to:'+self.fname)
return

这是应用它的代码:

outbuf=STDOUT2file()

#codes to print out to stdout

outbuf.off(msg=True)

我想让它更干净,阅读有关“闭包”的内容,但它在第一次调用时返回一个函数,类似于类的赋值类型。

我希望它是这样的:

STDOUT2 文件('开')

STDout2file('off',msg=True)

注意:重定向到 stdout 是我刚才遇到的一个例子。我想知道的是,除了类类型之外,任何其他方式都可以实现简单的功能,比如那些开/关类型,它涉及存储/检索应该的状态变量最好让外界看不见。

最佳答案

尝试改用上下文管理器。这个成语很常见,它被包含在 PEP that introduced context managers 中。 (此处略作修改):

from contextlib import contextmanager

@contextmanager
def redirect_stdout(new_stdout):
import sys
save_stdout = sys.stdout
sys.stdout = new_stdout
try:
yield
finally:
sys.stdout = save_stdout

或者,如果您愿意,带有 __enter____exit__ 的基于类的版本:

class redirect_stdout:
"""Context manager for temporarily redirecting stdout to another file

docstring truncated
"""

def __init__(self, new_target):
self.new_target = new_target

def __enter__(self):
self.old_target = sys.stdout
sys.stdout = self.new_target
return self.new_target

def __exit__(self, exctype, excinst, exctb):
sys.stdout = self.old_target

Raymond Hettinger 实际上 committed this to contextlib ,它将作为 contextlib.redirect_stdout() 包含在 python 3.4 中.

基本用法:

with open('somelogfile','a') as f:
with stdout_redirected(f):
print(something)

关于python - 用简单的函数替换类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22548755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com