在 isinstance() 检查中作为列表传递的 MutableSequence
MutableSequence to pass as a list in isinstance() check
我基于 collections.MutableSequence
:
构建了一个类似 class 的自定义列表
class MyList(collections.MutableSequence):
etc... behave mostly like a list...
value = MyList([1,2,3])
在处理列表数据之前,第三方库运行检查:
def check_correct_type(value):
assert isinstance(value, list)
我不希望在将自定义列表类对象传递给第三方库之前将其转换为内置列表。
有没有一种优雅的方法可以使 MyList
的实例在 isinstance(MyList([1,2,3]), list)
检查中看起来就像是 list
的实例?
不,如果不从 list
继承,您的 class 的实例将无法通过该测试。您有 subclass list
通过该测试。
您可以尝试同时继承 MutableSequence
和 list
;任何未由 class 或 MutableSequence
实现的方法或属性将在 list
上查找,因此您可能会以这种方式获得您不想要的额外方法,并且这些方法可能表现不佳出乎意料:
class MyList(collections.MutableSequence, list):
你也可以 monkeypatch check_correct_type()
函数,前提是它确实是一个像这样的独立函数:
def my_check_correct_type(value):
assert isinstance(value, collections.MutableSequence)
third_party_library.check_correct_type = my_check_correct_type
我基于 collections.MutableSequence
:
class MyList(collections.MutableSequence):
etc... behave mostly like a list...
value = MyList([1,2,3])
在处理列表数据之前,第三方库运行检查:
def check_correct_type(value):
assert isinstance(value, list)
我不希望在将自定义列表类对象传递给第三方库之前将其转换为内置列表。
有没有一种优雅的方法可以使 MyList
的实例在 isinstance(MyList([1,2,3]), list)
检查中看起来就像是 list
的实例?
不,如果不从 list
继承,您的 class 的实例将无法通过该测试。您有 subclass list
通过该测试。
您可以尝试同时继承 MutableSequence
和 list
;任何未由 class 或 MutableSequence
实现的方法或属性将在 list
上查找,因此您可能会以这种方式获得您不想要的额外方法,并且这些方法可能表现不佳出乎意料:
class MyList(collections.MutableSequence, list):
你也可以 monkeypatch check_correct_type()
函数,前提是它确实是一个像这样的独立函数:
def my_check_correct_type(value):
assert isinstance(value, collections.MutableSequence)
third_party_library.check_correct_type = my_check_correct_type