使用 Spotipy/Spotify API 的“else”序列问题

我和我的团队(Python 新手)编写了以下代码来生成与特定城市和相关术语相关的 Spotify 歌曲。如果用户输入的城市不在我们的 CITY_KEY_WORDS 列表中,那么它会告诉用户输入将添加到请求文件中,然后将输入写入文件。代码如下:



from random import shuffle

from typing import Any, Dict, List

import spotipy

from spotipy.oauth2 import SpotifyClientCredentials

sp = spotipy.Spotify(

    auth_manager=SpotifyClientCredentials(client_id="",

                                          client_secret="")

)

CITY_KEY_WORDS = {

    'london': ['big ben', 'fuse'],

    'paris': ['eiffel tower', 'notre dame', 'louvre'],

    'manhattan': ['new york', 'new york city', 'nyc', 'empire state', 'wall street', ],

    'rome': ['colosseum', 'roma', 'spanish steps', 'pantheon', 'sistine chapel', 'vatican'],

    'berlin': ['berghain', 'berlin wall'],

}


def main(city: str, num_songs: int) -> List[Dict[str, Any]]:

    if city in CITY_KEY_WORDS:

        """Searches Spotify for songs that are about `city`. Returns at most `num_songs` tracks."""

        results = []

        # Search for songs that have `city` in the title

        results += sp.search(city, limit=50)['tracks']['items']  # 50 is the maximum Spotify's API allows

        # Search for songs that have key words associated with `city`

        if city.lower() in CITY_KEY_WORDS.keys():

            for related_term in CITY_KEY_WORDS[city.lower()]:

                results += sp.search(related_term, limit=50)['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]

该代码对于“if”语句运行良好(如果有人进入我们列出的城市)。但是,当运行 else 语句时,在操作正常执行后会出现 2 个错误(它将用户的输入打印并写入文件)。


出现的错误是:


Traceback (most recent call last):

  File "...", line 48, in <module>

    display_tracks(tracks)

  File "...", line 41, in display_tracks

    for num, track in enumerate(tracks):

TypeError: 'NoneType' object is not iterable

请原谅我缺乏知识,但请有人帮忙解决这个问题吗?


我们还想在最后创建一个歌曲的播放列表,但在这方面遇到了困难。


尚方宝剑之说
浏览 65回答 2
2回答

九州编程

您的函数在子句中main没有语句,这会导致be&nbsp;。迭代何时是导致错误的原因。您可以采取一些措施来改进代码:returnelsetracksNonetracksNone关注点分离:该main函数正在做两件不同的事情,检查输入和获取曲目。一开始就做.lower()一次,这样就不必重复。遵循文档约定。使用前检查响应一些代码清理请参阅下面我上面建议的更改:def fetch_tracks(city: str, num_songs: int) -> List[Dict[str, Any]]:&nbsp; &nbsp; """Searches Spotify for songs that are about `city`.&nbsp; &nbsp; :param city: TODO: TBD&nbsp; &nbsp; :param num_songs:&nbsp; TODO: TBD&nbsp; &nbsp; :return: at most `num_songs` tracks.&nbsp; &nbsp; """&nbsp; &nbsp; results = []&nbsp; &nbsp; for search_term in [city, *CITY_KEY_WORDS[city]]:&nbsp; &nbsp; &nbsp; &nbsp; response = sp.search(search_term, limit=50)&nbsp; &nbsp; &nbsp; &nbsp; if response and 'tracks' in response and 'items' in response['tracks']:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; results += response['tracks']['items']&nbsp; &nbsp; # Shuffle the results so that they are not ordered by key word and return&nbsp; &nbsp; # at most `num_songs`&nbsp; &nbsp; shuffle(results)&nbsp; &nbsp; return results[: num_songs]def display_tracks(tracks: List[Dict[str, Any]]) -> None:&nbsp; &nbsp; """Prints the name, artist and URL of each track in `tracks`"""&nbsp; &nbsp; for num, track in enumerate(tracks):&nbsp; &nbsp; &nbsp; &nbsp; # Print the relevant details&nbsp; &nbsp; &nbsp; &nbsp; print(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f"{num + 1}. {track['name']} - {track['artists'][0]['name']} "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f"{track['external_urls']['spotify']}")def main():&nbsp; &nbsp; city = input("Virtual holiday city? ")&nbsp; &nbsp; city = city.lower()&nbsp; &nbsp; # Check the input city and handle unsupported cities.&nbsp; &nbsp; if city not in CITY_KEY_WORDS:&nbsp; &nbsp; &nbsp; &nbsp; print("Unfortunately, this city is not yet in our system. "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "We will add it to our requests file.")&nbsp; &nbsp; &nbsp; &nbsp; with open('requests.txt', 'a') as f:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.write(f"{city}\n")&nbsp; &nbsp; &nbsp; &nbsp; exit()&nbsp; &nbsp; number_of_songs = input("How many songs would you like? ")&nbsp; &nbsp; tracks = fetch_tracks(city, int(number_of_songs))&nbsp; &nbsp; display_tracks(tracks)if __name__ == '__main__':&nbsp; &nbsp; main()

慕标琳琳

当if执行 - 语句时,您将返回一个项目列表并将它们输入到display_tracks()函数中。else但是执行 - 语句时会发生什么?您将请求添加到文本文件中,但不返回任何内容(或项目NoneType)并将其输入到display_tracks(). display_tracks然后迭代此NoneType-item,抛出异常。您只想在确实有任何要显示的曲目时显示曲目。实现此目的的一种方法是将 的调用display_tracks()移至您的main函数中,但是如果没有找到您的搜索项的曲目,则会引发相同的错误。另一个解决方案是首先检查您的内容是否tracks不为空,或者使用类似的方法捕获TypeError- 异常tracks = main(city, int(number_of_songs))try:&nbsp; &nbsp; display_tracks(tracks)except TypeError:&nbsp; &nbsp; pass
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python