2 回答
TA贡献1785条经验 获得超4个赞
您的函数在子句中main
没有语句,这会导致be 。迭代何时是导致错误的原因。您可以采取一些措施来改进代码:return
else
tracks
None
tracks
None
关注点分离:该
main
函数正在做两件不同的事情,检查输入和获取曲目。一开始就做
.lower()
一次,这样就不必重复。遵循文档约定。
使用前检查响应
一些代码清理
请参阅下面我上面建议的更改:
def fetch_tracks(city: str, num_songs: int) -> List[Dict[str, Any]]:
"""Searches Spotify for songs that are about `city`.
:param city: TODO: TBD
:param num_songs: TODO: TBD
:return: at most `num_songs` tracks.
"""
results = []
for search_term in [city, *CITY_KEY_WORDS[city]]:
response = sp.search(search_term, limit=50)
if response and 'tracks' in response and 'items' in response['tracks']:
results += response['tracks']['items']
# Shuffle the results so that they are not ordered by key word and return
# at most `num_songs`
shuffle(results)
return results[: num_songs]
def display_tracks(tracks: List[Dict[str, Any]]) -> None:
"""Prints the name, artist and URL of each track in `tracks`"""
for num, track in enumerate(tracks):
# Print the relevant details
print(
f"{num + 1}. {track['name']} - {track['artists'][0]['name']} "
f"{track['external_urls']['spotify']}")
def main():
city = input("Virtual holiday city? ")
city = city.lower()
# Check the input city and handle unsupported cities.
if city not in CITY_KEY_WORDS:
print("Unfortunately, this city is not yet in our system. "
"We will add it to our requests file.")
with open('requests.txt', 'a') as f:
f.write(f"{city}\n")
exit()
number_of_songs = input("How many songs would you like? ")
tracks = fetch_tracks(city, int(number_of_songs))
display_tracks(tracks)
if __name__ == '__main__':
main()
TA贡献1830条经验 获得超9个赞
当if执行 - 语句时,您将返回一个项目列表并将它们输入到display_tracks()函数中。else但是执行 - 语句时会发生什么?您将请求添加到文本文件中,但不返回任何内容(或项目NoneType)并将其输入到display_tracks(). display_tracks然后迭代此NoneType-item,抛出异常。
您只想在确实有任何要显示的曲目时显示曲目。实现此目的的一种方法是将 的调用display_tracks()移至您的main函数中,但是如果没有找到您的搜索项的曲目,则会引发相同的错误。另一个解决方案是首先检查您的内容是否tracks不为空,或者使用类似的方法捕获TypeError- 异常
tracks = main(city, int(number_of_songs))
try:
display_tracks(tracks)
except TypeError:
pass
添加回答
举报