「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