Python str子类表示一个不是真实字符串的值

问题描述 投票:2回答:2

我是python的新手。正在扩展旧模块。到目前为止,它具有返回str(阻塞shell命令的输出)的函数。现在,我需要该函数还能够返回一个对象,以便以后可以对它执行操作(检查输出是否为非阻塞shell命令)。因此,该函数现在返回我的类的实例,该类从str继承来实现向后兼容性。问题是,但是,当将这样的对象传递给os.path.isdir时,即使字符串是有效路径,它始终返回False。

import os


class ShellWrap(str):

    def __new__(cls, dummy_str_value, process_handle):
        return str.__new__(cls,"")

    def __init__(self, dummy_str_value, process_handle):
        self._ph = process_handle
        self._output_str = ""

    def wait_for_output(self):
        # for simplicity just do 
        self._output_str = "/Users"

    def __str__(self):
        return str(self._output_str)

    def __repr__(self):
        return str(self._output_str)

    def __eq__(self,other):
        if (isinstance(other, str)):
            return other == str(self._output_str)
        else:
            return super().__eq__(self,other)

>>> obj = ShellWrap("",None)
>>> obj.wait_for_output()

>>> print(type(obj))
... <class '__main__.ShellWrap'>

>>> print (ShellWrap.__mro__)
... <class '__main__.ShellWrap'>
   (<class '__main__.ShellWrap'>, <class 'str'>, <class 'object'>)

>>> print(type(obj._output_str))
... <class 'str'>

>>> print(obj)
... /Users

>>> print(obj._output_str)
... /Users
>>> obj == "/Users"
... True

困扰我的是:

 >>> print(os.path.isdir(obj))
... False **<<-- This one puzzles me**
print(os.path.isdir("/Users"))
... True

我试图添加PathLike继承,并实现了一个更好的选择,但并不占优势:

class ShellWrap(str,PathLike):
   ....
   def __fspath__(self):
      return self._output_str

似乎还有一个我没有实现的dunder

。但是哪个?

但是,我确实在调试器中看到了一些奇怪的东西。当我将手表放在obj上时-它表示它是str类,但调试器显示的值不带引号(与其他“纯” str不同)。在调试器中手动在字符串中添加引号-使其起作用,但我想编辑字符串可能会创建一个新对象,这一次是纯str。

我想念什么?

Edit

:在意识到(请参见接受的答案)我尝试做的事情是不可能的之后,我决定挑战必须继承str的决定。 所以现在我的课没有继承任何东西。它仅实现了__str__, __repr__ and __fspath__,这似乎足够了!显然,只要存在str继承-它就具有优先权,不会调用dunder,并且会欺骗某些库来获取str值的底层C存储。

我是python的新手。正在扩展旧模块。到目前为止,它具有返回str(阻塞shell命令的输出)的函数。现在,我需要该函数还能够返回...

python string class inheritance subclass
2个回答
3
投票

您试图做的事是不可能的。

使用字符串的C代码访问由str类管理的实际字符串数据


2
投票

enter image description here

考虑os.path.isdir的来源。当您传入obj时,您可能会触发该值错误,因为您要评估的字符串是字符串子类的属性,而不是该子类应该表示的字符串。您需要在str的源代码中添加更多内容,才能找到要覆盖的正确成员。

© www.soinside.com 2019 - 2024. All rights reserved.