【问题标题】:Subclass' __getitem__ returns unexpected slice子类' __getitem__ 返回意外切片
【发布时间】:2013-07-19 02:42:50
【问题描述】:

我创建了一个子类 ConfigParser.SafeConfigParser 来实现无节配置文件的类。我遇到的问题是,与我期望 __getitem__ 的响应方式相比,我得到了一个意想不到的切片类型:

import ConfigParser

class foo(ConfigParser.SafeConfigParser):
    def __getitem__(self, option):
        return option

class bar(object):
    def __getitem__(self,option):
        return option

a = foo()
b = bar()
print a[:]
print b[:]

我得到的答复让我感到困惑:

slice(0, 2147483647, None)
slice(None, None, None)

在这两种情况下,我都期望(None, None, None)。我可以它的行为很熟悉——例如,如果我正在使用一个简单的list() 切片操作——但这​​使得通过if option.start is None 确定用户的意图变得特别困难,但失败了在前一种情况下。

SafeConfigParser 的哪一部分正在改变这种行为,我可以做些什么来接收(None, None, None) 而不是(0, sys.maxint, None)

【问题讨论】:

    标签: python python-2.7 subclass slice


    【解决方案1】:

    SafeConfigParser 是一个老式类,因此您的 foo 也是如此。你的bar 是一个新式类(派生自object)。

    >>> type(ConfigParser.SafeConfigParser)
    <type 'classobj'>
    
    >>> type(foo)
    <type 'classobj'>
    
    >>> type(bar)
    <type 'type'>
    

    旧式类与新式类有许多不同之处;显然,这是其中之一,大概是为了向后兼容(即因为这就是切片过去的行为方式)。它与SafeConfigParser 无关本身, 你可以在这里看到:

    class baz:    # old-style class in Python 2.x where x >= 2
        def __getitem__(self, option):
            return option
    
    c = baz()
    print c[:]    # slice(0, 2147483647, None)
    

    为了解决这个问题,我想您可以尝试更新 ConfigParser 以使用新样式的类。这可能相当容易;与 Python 3 的 configparser (不使用旧式类,因为 Python 3 中没有这样的东西)的差异可能会有所帮助。

    【讨论】:

    • 我应该想到它与旧式类有关,因为我痛苦地发现SafeConfigParser 的子类化有多少也不关心@property。我会看看 Python 3,也许它会引导我朝着正确的方向前进——谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多