为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

尚方宝剑之说 2023-12-12 15:02:57
我和我的团队(Python 新手)编写了以下代码来生成与特定城市和相关术语相关的 Spotify 歌曲。如果用户输入的城市不在我们的 CITY_KEY_WORDS 列表中,那么它会告诉用户输入将添加到请求文件中,然后将输入写入文件。代码如下:from random import shufflefrom typing import Any, Dict, Listimport spotipyfrom spotipy.oauth2 import SpotifyClientCredentialssp = 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请原谅我缺乏知识,但请有人帮忙解决这个问题吗?我们还想在最后创建一个歌曲的播放列表,但在这方面遇到了困难。
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

您的函数在子句中main没有语句,这会导致be 。迭代何时是导致错误的原因。您可以采取一些措施来改进代码:returnelsetracksNonetracksNone

  • 关注点分离:该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()


查看完整回答
反对 回复 2023-12-12
?
慕标琳琳

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


查看完整回答
反对 回复 2023-12-12
  • 2 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信