python - json キーに基づいて self キーワードを含むクラスで __init__ 関数を定義する方法

okwaves2024-01-25  8

「self」というキーを含む json str があります。 API から来ています。一般に、辞書をクラスに渡したいと考えていますが、指定されたキーの 1 つ (self) が問題を引き起こします。驚くことはありません。しかし、それを修正する方法がわかりません。

私のクラスは次のようになります:

class Issue:
    def __init__(self, expand, fields, key, self):
        self.expand = expand
        self.assignee = fields['assignee']['displayName']
        self.key = key
        self.self = self
    
    @classmethod
    def from_json(cls, json_dict):
        return cls(**json_dict)

オブジェクトをインスタンス化するには、次のように記述します。

Issue.from_json(json_dictionary)

修正できないタイプ エラーが表示されます:

TypeError: __init__() got multiple values for argument 'self'

先頭にアンダースコアなどを使用して別のバージョンをすでに試しましたが、役に立ちませんでした。これを実行すると:

class Issue:
    def __init__(self, expand, fields, key, aSelf):
        self.expand = expand
        self.assignee = fields['assignee']['displayName']
        self.key = key
        self.self = aSelf
    
    @classmethod
    def from_json(cls, json_dict):
        return cls(**json_dict)

エラーメッセージは同じままです。このような問題に対処する方法を説明していただけますか?

aSelf を使用した例は、json_dict にキー self が含まれており、__init__() シグネチャで定義した引数名に関係なく **json_dict を実行するため、機能しません。 Python は json_dict からのすべてのキーを引数名として渡し、その値を引数として渡すため、最終的には別の自分になります。これを機能させるには、from_json() の json_dict を変更し、キー self の名前を aSelf に変更する必要があります。

– ブラミ

2020 年 9 月 3 日 11:59



------------------------

最初の電話をかけるメソッド self の引数は単なる慣例です。名前は特別なものではありません。技術的にはそう呼ぶ必要はありません。正当な理由がある場合は、別の名前で呼ぶこともできます。

def __init__(self_, expand, fields, key, self):
    self_.expand = expand
    self_.assignee = fields['assignee']['displayName']
    self_.key = key
    self_.self = self



------------------------

これは、json_dictionary 内のキーがクラスのコンストラクターと一致しないためです。以下を試してみてください:

class Issue:
    def __init__(_self_, **kwargs):
        if 'expand' in kwargs:
            _self_.expand = kwargs['expand']
        ... # same for the rest of values

    @classmethod
    def from_json(cls, json_dict):
        return cls(**json_dict)

4

1

これは「引数「self」の複数の値」を修正するものではありません。

– user2357112

2020 年 9 月 3 日 11:53

**kwargs に self キーを入れると、引数を処理するときに Python インタープリターが同じ問題に遭遇するため、これは機能しません (double-self があいまいになります)。

– ブラミ

2020 年 9 月 3 日 11:54

json_dict にセルフキーがある場合は、そうかもしれません。回答を更新しました。

– 精神

2020 年 9 月 3 日 12:00

また、私のソリューションは json_dict 内の任意の数のキーでも機能します

– 精神

2020 年 9 月 3 日 12:04

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。