我熟悉C#语法,例如,通过List<string> MyList
创建字符串列表。
如果我尝试添加一个不在集合类型中的类型,python中是否有类似的语法会导致它失败?
答案 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
循环迭代循环,构建我们自己的副本,我实际上不需要这样做成语;但我想举一个成语的例子,以帮助新手阅读这篇文章。