在Python 2.5中创建“类型化”列表

时间:2011-10-05 01:33:42

标签: c# python list

我熟悉C#语法,例如,通过List<string> MyList创建字符串列表。

如果我尝试添加一个不在集合类型中的类型,python中是否有类似的语法会导致它失败?

2 个答案:

答案 0 :(得分:1)

没有。您需要创建一个适当实现__*item__() methods的自定义类。

答案 1 :(得分:1)

正如其他人所说,Python并没有内置的东西。

如果你想做类似的东西,你可以继承内置的list()类,并使所有允许插入或附加元素的方法进行类型检查。或者,您可以使自定义方法尝试强制类型,而不是类型检查。

以下是仅包含int()值的列表的示例实现。它会强制您尝试插入或附加到其中的任何内容,并引发相应的错误。我将内置list()类型子类化,因此我编写的代码只是异常;您在此处看到的任何内容都与基本list()类型完全相同。我只需要勾选一些方法。我还为它提供了一个自定义.__init__()方法,该方法接受列表或其他序列并初始化对象。

这是一个不完整的实施;例如,它不会覆盖.insert()方法。但我认为它向您展示了基本想法,如果您真的想要一个IntList()课程,您可以将其作为基础。

class IntList(list):
    def __init__(self, seq=None):
        if seq is not None:
            try:
                for x in seq:
                    self.append(int(x))
            except ValueError:
                raise ValueError, "can only use int values to init IntList"
    def __setitem__(self, i, x):
        try:
            list.__setitem__(self, i, int(x))
        except ValueError:
            raise ValueError, "can only set int values into IntList"
    def append(self, x):
        try:
            list.append(self, int(x))
        except ValueError:
            raise ValueError, "can only append int values to IntList"


lst = [0, 1, 't']

try:
    o = IntList(lst) # raises exception
except ValueError:
    print("lst has a 't' in it")

o = IntList(range(3))  # works

try:
    o[1] = 't'
except ValueError:
    print("cannot set to 't'")

o[1] = 2  # works

o.append(4)  # works
o.append('t') # raises error

以上版画:

lst has a 't' in it
cannot set to 't'
Traceback (most recent call last):
  File "t.py", line 38, in <module>
    o.append('t') # raises error
  File "t.py", line 18, in append
    raise ValueError, "can only append int values to IntList"
ValueError: can only append int values to IntList

对于None函数中的列表参数,有一个常见的Python惯用法,即将默认参数设置为.__init__()。这是因为默认值列表仅在编译时评估一次,并且保存对此列表的引用将意味着该类的每个实例共享同一实例。在这种情况下,由于我们有一个for循环迭代循环,构建我们自己的副本,我实际上不需要这样做成语;但我想举一个成语的例子,以帮助新手阅读这篇文章。