【问题标题】:I get a warning when initializing a class that says 'parameter value is not used' in Python在 Python 中初始化“未使用参数值”的类时收到警告
【发布时间】:2020-10-25 22:23:52
【问题描述】:

我有以下代码,其中一个类具有 3 个属性和两个函数。

import json


class Song:
    def __init__(self, name, artist, full_title=None):
        self.name = name
        self.artist = artist
        self.full_title = self.name + ' ' + self.artist


def save_json(list_of_objects, json_file):
    # json save
    with open(json_file, 'w') as fp:
        json.dump(list_of_objects, fp, indent=4)


def load_json(json_file):
    # json load
    with open(json_file, 'r') as fp:
        loaded_data = json.load(fp)
    return loaded_data


file = 'my_songs.json'

song1 = Song('Roar', 'Katy Perry')
song2 = Song('Hello', 'Adele')
song3 = Song('Grenade', 'Bruno Mars')


list_of_songs = [song1, song2, song3]
list_of_songs_dict = [vars(s) for s in list_of_songs]

save_json(list_of_songs_dict, file)

如您所见,该对象使用三个参数(名称、艺术家、完整标题)进行初始化

代码创建一个对象列表并将其转储到名为“my_songs.json”的 json 文件中。

json文件长这样

[
    {
        "name": "Roar",
        "artist": "Katy Perry",
        "full_title": "Roar Katy Perry"
    },
    {
        "name": "Hello",
        "artist": "Adele",
        "full_title": "Hello Adele"
    },
    {
        "name": "Grenade",
        "artist": "Bruno Mars",
        "full_title": "Grenade Bruno Mars"
    }
]

我想从 json 文件(名为“my_songs.json”)重新创建名为“list_of_songs”的列表。

这就是我的做法:

loaded_songs = load_json(file)

list_of_songs_from_json = [Song(**o) for o in loaded_songs]
print(list_of_songs_from_json)

IDE 显示一条警告,提示“未使用参数 full_title 值”

如果我从类初始化中删除 'full_title=None',我会收到以下错误消息:

TypeError: __init__() got an unexpected keyword argument 'full_title'

'full_title=None' 在类初始化中的原因是,在某些情况下,我想使用 2 个参数来定义对象,而在其他情况下(比如从 json 文件加载数据时)我想使用 3 个参数定义对象。

我怀疑有一种“正确”或“更好”的方法可以做到这一点,因此发出警告。有关如何删除警告并实现代码已经完成的任何建议?

谢谢。

【问题讨论】:

    标签: python json oop initialization typeerror


    【解决方案1】:

    full_title 不是 None 时需要添加信息。警告来了,因为 对于self.full_title,您使用的是self.aself.b,如果full_title 不是None,则它的值不会在任何地方使用。

    对您的代码进行一些修改,检查full_title 是否为None

    class Song:
    def __init__(self, name, artist, full_title=None):
        self.name = name
        self.artist = artist
        if full_title is None:
             self.full_title = self.name + ' ' + self.artist
        else:
             self.full_title = full_title
    

    【讨论】:

    • 我想如下:如果我在创建对象时引入2个参数,我希望self.full_title为self.name + ' ' + self.artist,如果我在引入3个参数时创建对象时,我希望 self.full_title 成为我引入的第三个参数。
    • @ArmanMojaver 这个代码和你现在问的一样
    • 是的,代码有效,但我从 IDE (Pycharm) 收到警告,这意味着有一种“正确”的方式来执行此操作。我想这样学习。谢谢
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2015-12-30
    相关资源
    最近更新 更多