【问题标题】:MutableSequence to pass as a list in isinstance() check在 isinstance() 检查中作为列表传递的 MutableSequence
【发布时间】:2015-03-08 12:35:22
【问题描述】:

我基于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 的实例?

【问题讨论】:

  • 听起来像是一个分叉,或者至少需要关于该第 3 方库的发布报告;)

标签: python python-2.7 collections isinstance


【解决方案1】:

不,如果不继承 list,您的类实例就无法通过该测试。您必须继承 list 以通过该测试。

你可以尝试继承MutableSequencelist;任何未由您的类或 MutableSequence 实现的方法或属性都将在 list 上查找,因此您可能会得到额外的方法,这些方法您不希望这样,并且可能会出现意外行为:

class MyList(collections.MutableSequence, list):

您也可以对 check_correct_type() 函数进行猴子补丁,前提是它确实是这样的独立函数:

def my_check_correct_type(value):
    assert isinstance(value, collections.MutableSequence)

third_party_library.check_correct_type = my_check_correct_type

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2021-01-29
    • 2020-06-21
    • 2015-01-25
    相关资源
    最近更新 更多