gpt4 book ai didi

python - 如何制作一个像字符串一样的类?

转载 作者:太空宇宙 更新时间:2023-11-03 12:42:40 24 4
gpt4 key购买 nike

我有一个上下文管理器,可以将 with 语句下缩进的代码块的输出捕获到字符串。此上下文管理器生成一个自定义结果对象,当 block 执行完毕时,该对象将包含捕获的输出。

from contextlib import contextmanager

@contextmanager
def capturing():
"Captures output within a 'with' block."
from cStringIO import StringIO

class result(object):
def __init__(self):
self._result = None
def __str__(self):
return self._result

try:
stringio = StringIO()
out, err, sys.stdout, sys.stderr = sys.stdout, sys.stderr, stringio, stringio
output = result()
yield output
finally:
output._result, sys.stdout, sys.stderr = stringio.getvalue(), out, err
stringio.close()

with capturing() as text:
print "foo bar baz",

print str(text) # prints "foo bar baz"

当然,我不能只返回一个字符串,因为字符串是不可变的,因此用户从 with 语句返回的字符串在他们的代码块运行后不能更改。然而,在事后使用 str 将结果对象显式转换为字符串是一件很麻烦的事(我还尝试过让对象可调用,作为一种语法糖)。

那么是否有可能使结果实例像一个字符串一样工作,因为它实际上在命名时返回一个字符串?我尝试实现 __get__,但这似乎只适用于属性。或者我想做的事情真的不可能吗?

最佳答案

如何创建一个类似于字符串的类?子类 str

import os
class LikeAStr(str):
'''Making a class like a str object; or more precisely
making a str subclass with added contextmanager functionality.'''

def __init__(self, diff_directory):
self._iwd = os.getcwd()
self._cwd = diff_directory

def __enter__(self):
return self

def __exit__(self, ext_typ, exc_value, traceback):
try: os.chdir(self._iwd) # might get deleted within the "with" statement
except: pass

def __str__(self):
return self._cwd

def __repr__(self):
return repr(self._cwd)


astr = LikeAStr('C:\\')

with LikeAStr('C:\\') as astr:
print 1, os.getcwd()
os.chdir( astr ) # expects str() or unicode() not some other class
print 2, os.getcwd()
#

# out of with block
print 3, os.getcwd()
print 4, astr == 'C:\\'

输出:

1 D:\Projects\Python\
2 C:\
3 D:\Projects\Python\
4 True

关于python - 如何制作一个像字符串一样的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3919644/

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