【发布时间】:2020-05-10 13:13:43
【问题描述】:
我在玩 mypy 和一些 Python 的基本迭代,并编写了以下代码库:
from typing import Iterator
from datetime import date, timedelta
class DateIterator:
def __init__(self, start_date, end_date):
self.start_date = start_date
self.end_date = end_date
self._total_dates = self._get_all_dates()
def _get_all_dates(self) -> Iterator[date]:
current_day = self.start_date
while current_day <= self.end_date:
yield current_day
current_day += timedelta(days=1)
def __len__(self):
print("Calling the len function...")
return len(self._total_dates)
def __getitem__(self, index):
print(f"Calling getitem with value of index as {index}")
return self._total_dates[index]
if __name__ == "__main__":
date_iterator = DateIterator(date(2019, 1, 1), date(2019, 1, 15))
for new_date in date_iterator:
print(new_date)
date_str = ",".join([str(new_date) for new_date in date_iterator])
print(date_str)
print(f"Checking the length of the collection {len(date_iterator)}")
print(f"Checking if indexing works : {date_iterator[4]}")
现在也玩mypy 我遇到了以下问题:
iterator_test_with_getitem.py:30: error: Cannot assign to a type
iterator_test_with_getitem.py:30: error: "DateIterator" has no attribute "__iter__" (not iterable)
iterator_test_with_getitem.py:33: error: "DateIterator" has no attribute "__iter__" (not iterable)
Found 3 errors in 1 file (checked 1 source file)
有人可以指导我,如果一个对象可以通过添加__len__ 和__getitem__ 方法进行迭代,那么为什么mypy 在没有iter 方法时会抱怨
也有人可以告诉我第 30 行的问题是什么。我也找不到该错误的任何合乎逻辑的解释。
【问题讨论】:
-
在此代码上运行 mypy 时,没有看到“无法分配给类型”错误。我怀疑这来自您使用
for date in date_iterator而不是for new_date in date_iterator的代码版本。