gpt4 book ai didi

python - 如何使用 name 属性实例化 io.TextIOWrapper 对象?

转载 作者:行者123 更新时间:2023-12-04 14:15:37 24 4
gpt4 key购买 nike

import sys

print(sys.stdin)
print(type(sys.stdin))
print(sys.stdin.name)
print(sys.stdin.__dict__)

执行上述操作后,输出如下:
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
<class '_io.TextIOWrapper'>
<stdin>
{'mode': 'r'}

所以从上面的片段和输出中,我可以看到 name_io.TextIOWrapper 的一个属性实例表示 sys.stdin .来自 io.TextIOWrapper 的文档(例如通过 $ pydoc io.TextIOWrapper),它确实列出了 name作为数据描述符。然而,无论出于何种原因, name未在其 __dict__ 中显示为项目.

当我创建 io.TextIOWrapper 的实例时手动使用例如:

import io

a = io.TextIOWrapper(io.BytesIO())
print(a)
a.name
<_io.TextIOWrapper encoding='UTF-8'>被打印。但是 a.name行抛出错误: AttributeError: '_io.BytesIO' object has no attribute 'name' ; AttributeError我预料到了,但我没想到它会说它是 _io.BytesIO目的。

然后我尝试创建一个子类并附加一个 name手动属性,像这样:

import io


class NamedTextIOWrapper(io.TextIOWrapper):

def __init__(self, buffer, name=None, **kwargs):
self.name = name
io.TextIOWrapper.__init__(self, buffer, **kwargs)


input = io.BytesIO('abc')
stdin = NamedTextIOWrapper(input, name='<stdin>', encoding='utf-8')

print(stdin.name)

但是这会遇到: AttributeError: attribute 'name' of '_io.TextIOWrapper' objects is not writable .

理想情况下,我还希望能够维护 mode属性在 sys.stdin 中似乎可用手动实例化的实例 io.TextIOWrapper对象。也适用于 sys.stdout等价的,我认为除了 name 之外都是一样的应该只是设置为 '<stdout>'mode'w' .

最佳答案

您可以覆盖 __getattribute__方法之一返回 name name时对象的属性字典的键请求属性:

class NamedTextIOWrapper(io.TextIOWrapper):
def __init__(self, buffer, name=None, **kwargs):
vars(self)['name'] = name
super().__init__(buffer, **kwargs)

def __getattribute__(self, name):
if name == 'name':
return vars(self)['name']
return super().__getattribute__(name)

以便:
input = io.BytesIO(b'abc')
stdin = NamedTextIOWrapper(input, name='<stdin>', encoding='utf-8')
print(stdin.name)

输出:
<stdin>

关于python - 如何使用 name 属性实例化 io.TextIOWrapper 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60622854/

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