我有以下内容:
# returns a list of all items in ads collection
class Vault:
def __init__(self):
myDate = self.getTodayDate()
myTime = self.getTodayTime()
# used to mock collection (table) of ads
self._ads = [ {
'id': '00000000-0000-0000-0000-000000000000',
'date': myDate,
'time': myTime,
'source': 'chron.com',
'advertiser': 'itunes.apple.com',
'width': 300,
'height': 250
} ]
def get_all_ads(self):
return ( ad for ad in self._ads )
def get_all_adsn(self,n):
n = int(n)
if self._ads.__len__()<n:
return self.get_all_ads()
max = self._ads[0, n]
return ( ad for ad in max )
当n
小于广告的长度时,它会正确返回。因此get_all_ads
有效。问题是当我尝试获取特定数量的广告时。当我尝试获取特定数字,例如ads[0, n]
然后执行同样的操作以获取所有广告时,我收到以下错误:
类型错误
TypeError:list indices必须是整数,而不是元组自:
文件&#34; /Users/tai/Desktop/FlashY/flashy/repository/mock.py",第162行,在get_all_adsn中max = self._ads [0,n]
._ads
是一个列表,为什么我无法访问它?我将n
转换为int
(我使用flask / routes来调用它)。因此,如果我运行get_all_adsn(2)
,我会得到正确的结果,但是当我运行get_all_adsn(1)
时,我会收到错误。
我不理解我的错误,我试图按元素拆分列表(数组,我创建它像[{},{},...]
)。为什么谈论元组?
答案 0 :(得分:2)
你的代码max = self._ads[0,n]
不是有效的python。在python中切片列表的语法是self._ads[0:n]
,请尝试使用
def get_all_adsn(self,n):
n=int(n)
if self._ads.__len__()<n:
return self.get_all_ads()
return tuple(self._ads[0:n])
P.S。我冒昧地清理了代码的最后两行。实际上,python切片足够智能,如果切片超出序列的上限(列表,元组,无论如何),它只会返回整个序列。这意味着您可以将整个函数重写为一个简单的切片
def get_all_adsn(self,n):
return self._ads[0:int(n)]
答案 1 :(得分:1)
代码中的变量_ads
是一个列表。并访问列表:
_ads[0, 2]
在Python中没有任何意义,这就是你看错的原因。您可以通过在Python shell中尝试来确认这一点:
>>> a_list = [1, 2, 3]
>>> a_list[0, 2]
Traceback (most recent call last):
File "<pyshell#108>", line 1, in <module>
a_list[0, 2]
TypeError: list indices must be integers, not tuple
调用get_all_adsn(2)
时代码的工作原因是因为在这种情况下n
为2并且在代码中传递了此条件:
if self._ads.__len__() < n:
因此不执行该行:
max=self._ads[0,n]
您可能希望将其更改为:
max=self._ads[0:n]
答案 2 :(得分:1)
l[1, 2]
与l[(1, 2)]
相同,这不是您想要的。您可能打算使用切片,它具有不同的语法(l[1:2]
):
class Vault:
def __init__(self):
self.ads = [{
'id': '00000000-0000-0000-0000-000000000000',
'date': self.getTodayDate(),
'time': self.getTodayTime(),
'source': 'chron.com',
'advertiser': 'itunes.apple.com',
'width': 300,
'height': 250
}]
def get_all_ads(self):
return self.ads
def get_all_adsn(self, n):
return self.ads[:n]